如何安排使用NodeJS和Generators每天运行的函数?

时间:2017-05-13 17:47:23

标签: node.js scheduled-tasks generator schedule node-cron

我需要在给定时间每天调用一个函数使用生成器(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);
});

正如问题中所指出的那样,'嗨'被打印出来而'结果'没有打印出来。

我无法找到一种方法来安排发电机的功能,如果你们中的一些人知道如何做到那就太好了!提前感谢你们

2 个答案:

答案 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!