我需要在给定时间每天调用一个函数使用生成器(yield),进行搜索我发现了两个节点模块,可以让我这样做,一个是{ {3}} 另一个是node-schedule
Node-cron 似乎不支持生成器
节点时间表应该有支持,但似乎无法正常工作,如下所示:node-cron
为了更清楚我正在努力实现的目标,我附上相同的代码#325的问题:
const date = momemt().add(1, 's'); // 1 second after now.
schedule.scheduleJob('taksid', date, function*(){
console.log('Hi');
const result = yield Message.findAll();
console.log('Result: ' + result);
});
正如问题中所指出的那样,'嗨'被打印出来而'结果'没有打印出来。
我无法找到一种方法来安排发电机的功能,如果你们中的一些人知道如何做到那就太好了!提前感谢你们
答案 0 :(得分:0)
遇到了同样的问题“如何安排一个函数每天运行NodeJS和Generators?”在周末和周末之后我想出了一个解决方案。也许它也可以解决你的问题。
第一步是创建一个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
说明:将此命名为“myFancyFileToScheduleYields.sh”并将其放在根目录中。接下来使用以下内容创建“scheduleYields.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”并观察魔法是如何发生的。
这将根据documentation每5分钟运行一次任务。现在去适应你的用例并提供反馈,如果有效的话。
我甚至用Docker对它进行了测试,并且也可以正常运行:)
答案 1 :(得分:0)
通过使用vo,我找到了一个比上面提到的第一个更好的解决方案。将我的用例应用于您的用户,您必须执行以下操作。从函数中提取生成器并将其放入“search.js”
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);
解释:这将每30秒执行一次任务,并每秒给你反馈。
解决方案也适用于Docker!