Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何安排每天使用NodeJ和生成器运行的函数?_Node.js_Scheduled Tasks_Generator_Schedule_Node Cron - Fatal编程技术网

Node.js 如何安排每天使用NodeJ和生成器运行的函数?

Node.js 如何安排每天使用NodeJ和生成器运行的函数?,node.js,scheduled-tasks,generator,schedule,node-cron,Node.js,Scheduled Tasks,Generator,Schedule,Node Cron,我需要一个函数,每天在给定的时间用生成器调用,通过搜索我找到了两个节点模块,一个是 另一个是 节点cron似乎不支持生成器 节点调度应该有支持,但它似乎不起作用,正如这里指出的: 为了更清楚地了解我试图实现的目标,我附加了与问题相同的代码#325: 如问题中所述,“Hi”将打印出来,而“result”则不会打印出来 我无法找到一种方法来安排一个带有生成器的函数,如果你们中的一些人知道如何做的话,那就太好了!提前感谢各位周五遇到了同样的问题“如何安排每天使用NodeJ和生成器运行的函数?”周末刚过

我需要一个函数,每天在给定的时间用生成器调用,通过搜索我找到了两个节点模块,一个是 另一个是

节点cron似乎不支持生成器

节点调度应该有支持,但它似乎不起作用,正如这里指出的:

为了更清楚地了解我试图实现的目标,我附加了与问题相同的代码#325:

如问题中所述,“Hi”将打印出来,而“result”则不会打印出来


我无法找到一种方法来安排一个带有生成器的函数,如果你们中的一些人知道如何做的话,那就太好了!提前感谢各位

周五遇到了同样的问题“如何安排每天使用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);