如何安排一个function,每天使用NodeJS和Generators运行?

我需要一个函数,每天在一个给定的时间与生成器 (yield)进行调用,做我的search我已经find了两个节点模块,使我能够做到这一点,一个是node-schedule ,另一个是node-cron

Node-cron 似乎不支持生成器

节点时间表应该有支持,但它似乎不工作在这里指出: 问题#325

为了更清楚我想要完成什么,我附上了#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); }); 

如问题所述,'嗨'被打印出来,'结果'不打印。

我无法find一个方法来安排一个函数与发电机,如果你们中有些人知道如何做到这一点将是伟大的! 先谢谢你们

遇到同样的问题“如何安排一个function每天与NodeJS和发电机运行? 周五和周末之后,我想出了一个解决scheme。 也许这也可能解决你的问题。

第一步是创build一个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”,并将其放在根目录中。 接下来用下面的内容创build一个“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(); }); 

最后做“节点scheduleYields.js”并观察魔法是如何发生的。

根据文档,这将每隔5分钟执行一次任务。 现在去适应你的用例,并提供反馈,如果它的工作。

我甚至用Dockertesting过,而且也工作得很好:)

我发现了一个解决scheme,作为第一个使用vo提到的更好的解决scheme。 把我的用例应用到你的你将不得不做以下事情。 从你的函数中提取生成器,并把它放到一个“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!"); }); } 

创build另一个文件,在其中安排您的任务,如下所示。

 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秒运行一次你的任务,每秒给你一个反馈。

该解决scheme也适用于Docker!