如何以间隔为基础调用生成器(异步)函数

时间:2017-03-29 17:00:11

标签: javascript asynchronous setinterval adonis.js

我正在构建一个必须每2秒轮询远程设备(生成器fn sendRequests())的应用程序。

使用setInterval调用生成器fn的正确方法是什么,setInterval不是生成器而且不会产生

function * sendRequests() {
  // multiple remote async requests are sent
}

var timer = setInterval(() => {
  // yield sendRequests()
}, 2000)

2 个答案:

答案 0 :(得分:0)

由于AdonisJS在引擎盖下使用co(),我使用@Bergi建议包装在co()

function * sendRequests() {
  // multiple remote async requests are sent
}

var timer = setInterval(() => {
  co(function * () {
    yield sendRequests()
  })
}, 2000)

答案 1 :(得分:0)

通过setInterval回调产生收益的问题是yield只能产生于立即包含它的生成器function*。因此,您无法通过回调yield

您可以通过回调执行的操作是解决一个Promise,您的生成器函数可以yield

async function* pollGen() {
  yield new Promise((resolve, reject) => {
    setInterval(() => resolve(...), 2000);
  });

问题在于Promise can only be settled once。因此,每2000毫秒调用一次resolve只会超出第一次调用。

相反,您可以做的是在一个while循环中反复调用setTimeout

async function* pollGen() {
  let i = 0;
  while (i < 10)
    yield new Promise((resolve, reject) => {
      setTimeout(() => resolve(i++), 200);
    });
}

(async function main() {
  // for-await-of syntax
  for await (const result of pollGen())
    console.log(result);
}());

新的for-await-of语法自Node v9.2起可用,并且可以在Node v10或更高版本中使用而没有任何标志。