Javascript 如何按间隔调用生成器(异步)函数

Javascript 如何按间隔调用生成器(异步)函数,javascript,asynchronous,setinterval,adonis.js,Javascript,Asynchronous,Setinterval,Adonis.js,我正在构建一个必须每2秒轮询远程设备(generator fnsendRequests())的应用程序 使用setInterval调用生成器fn的正确方法是什么?setInterval不是生成器,也不会产生 function * sendRequests() { // multiple remote async requests are sent } var timer = setInterval(() => { // yield sendRequests() }, 2000)

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

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

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

var timer = setInterval(() => {
  // yield sendRequests()
}, 2000)
由于AdonisJS在引擎盖下使用co(),所以我使用@Bergi建议用co()包装


setInterval
回调中让步的问题是
yield
只能让步给立即包含它的生成器
函数*
。因此,您不能从回调中
产生

您可以从回调函数中解析一个承诺,您的生成器函数可以
生成该承诺:

异步函数*pollGen(){
产生新的承诺((决定、拒绝)=>{
setInterval(()=>resolve(…),2000);
});
问题在于,每2000毫秒调用一次
resolve
,除了第一次调用之外,什么都做不了

相反,您可以在while循环中重复调用
setTimeout

异步函数*pollGen(){
设i=0;
而(i<10)
产生新的承诺((决定、拒绝)=>{
setTimeout(()=>resolve(i++),200);
});
}
(异步函数main(){
//等待语法
用于等待(pollGen()的常量结果)
控制台日志(结果);

}());
为什么这是一个生成器函数?它最多不应该是一个
异步函数
吗?您是否忘记将它包装在
co.wrap
(或您正在使用的任何异步运行程序库)中?为了清楚起见,我将更新问题,但函数是一个生成器。它位于AdonisJS平台上,使用生成器代替异步操作的承诺和回调,并且还没有为ES7异步fns做好准备。在这种情况下,异步操作是一个远程MODBUS/TCP请求。这可以工作,但您的while循环基本上阻止了执行只要承诺没有得到解决,哪种方式会破坏您的
setTimeout
的目的。
function * sendRequests() {
  // multiple remote async requests are sent
}

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