Node.js 如何安排每天使用NodeJ和生成器运行的函数?
我需要一个函数,每天在给定的时间用生成器调用,通过搜索我找到了两个节点模块,一个是 另一个是 节点cron似乎不支持生成器 节点调度应该有支持,但它似乎不起作用,正如这里指出的: 为了更清楚地了解我试图实现的目标,我附加了与问题相同的代码#325: 如问题中所述,“Hi”将打印出来,而“result”则不会打印出来Node.js 如何安排每天使用NodeJ和生成器运行的函数?,node.js,scheduled-tasks,generator,schedule,node-cron,Node.js,Scheduled Tasks,Generator,Schedule,Node Cron,我需要一个函数,每天在给定的时间用生成器调用,通过搜索我找到了两个节点模块,一个是 另一个是 节点cron似乎不支持生成器 节点调度应该有支持,但它似乎不起作用,正如这里指出的: 为了更清楚地了解我试图实现的目标,我附加了与问题相同的代码#325: 如问题中所述,“Hi”将打印出来,而“result”则不会打印出来 我无法找到一种方法来安排一个带有生成器的函数,如果你们中的一些人知道如何做的话,那就太好了!提前感谢各位周五遇到了同样的问题“如何安排每天使用NodeJ和生成器运行的函数?”周末刚过
我无法找到一种方法来安排一个带有生成器的函数,如果你们中的一些人知道如何做的话,那就太好了!提前感谢各位周五遇到了同样的问题“如何安排每天使用NodeJ和生成器运行的函数?”周末刚过,我就想出了一个解决方案。也许这也能解决你的问题 第一步是创建一个shell文件。我使用的是Windows 10,因此如果使用Mac,您可能必须对其进行调整
#!/bin/bash
echo " # Starting Scraper ..."
pkill -f "node fileWithYieldToBeScheduled.js"
sleep 1
node fileWithYieldToBeScheduled.js -D
status=$?
if [ $status -ne 0 ]; then
echo "Failed to start node: $status"
exit $status
else
echo "Success"
fi
说明:将其命名为“MyFancyFileToScheduleGuides.sh”,并将其放置在根目录中。接下来创建一个包含以下内容的“scheduleGenders.js”
const childProcess = require('child_process');
var cron = require('node-cron');
/**
* Your task to be scheduled.
*/
const startFileWithYields= function () {
childProcess.exec(__dirname + "/myFancyFileToScheduleYields.sh", function (err, stdout, stderr) {
if (err) {
return console.log(stderr);
}
console.log(stdout);
});
}
cron.schedule('*/5 * * * *', function () {
startFileWithYields();
});
最后做“node scheduleYields.js”并观察魔术是如何发生的
这将根据的每5分钟运行一次任务。现在去适应你的用例,如果有用的话,给反馈
我甚至用Docker对此进行了测试,而且效果也很好:)我发现了一个解决方案,通过使用。将我的用例应用到您的用例中,您必须执行以下操作。从函数中提取生成器并将其放入“search.js”中 创建另一个文件,在其中安排任务,如下所示
const search = require('./search');
const WAIT_SEK = 30;
const WAIT_MS = WAIT_SEK * 1000;
let countSek = 0;
const loopSearch = setInterval(() => {
if ((countSek % WAIT_SEK) === 0) {
search.findAll();
countSek = 0;
}
console.log(`Next search in: ${(WAIT_SEK - countSek)}`)
countSek += 1;
}, 1000);
解释:这将每30秒运行一次任务,并每秒向您提供反馈
该解决方案也适用于Docker 那么,您希望如何恢复该功能?生成器函数与异步函数不同,如果它们没有显式迭代,它们将在第一次生成时暂停。您需要编写一个驱动程序来正确地逐步完成函数,特别是当
Message.findAll()
是一个异步函数时,我假设它是。
function* findAll() {
console.log('Hi');
const result = yield Message.findAll();
console.log('Result: ' + result);
}
exports.findAll = function() {
vo(findAll)(function (err, result) {
if (err) {
console.log(err);
}
console.log("It worked!");
});
}
const search = require('./search');
const WAIT_SEK = 30;
const WAIT_MS = WAIT_SEK * 1000;
let countSek = 0;
const loopSearch = setInterval(() => {
if ((countSek % WAIT_SEK) === 0) {
search.findAll();
countSek = 0;
}
console.log(`Next search in: ${(WAIT_SEK - countSek)}`)
countSek += 1;
}, 1000);