2

我需要每天在给定时间使用生成器(产量)调用一个函数,进行搜索我发现两个节点模块使我能够做到这一点,一个是node-schedule ,另一个是node-cron

Node-cron 似乎不支持生成器

Node-schedule应该有支持,但它似乎不能像这里指出的那样工作:issue #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);
});

如问题中所述,“Hi”被打印出来,而“result”没有。

如果你们中的一些人知道该怎么做,那我无法找到一种方法来安排生成器的功能!先谢谢各位

4

2 回答 2

0

遇到了同样的问题“如何安排函数每天使用 NodeJS 和生成器运行?” 在星期五和周末之后,我想出了一个解决方案。也许它也可以解决您的问题。

第一步是创建一个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”并观察魔术是如何发生的。

这将根据文档每 5 分钟运行一次任务。现在去调整它以适应您的用例,如果它有效,请提供反馈。

我什至用 Docker 对此进行了测试,并且效果也很好:)

于 2017-07-31T06:41:47.480 回答
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!

于 2017-08-01T07:53:48.313 回答