Javascript 如何按间隔调用生成器(异步)函数
我正在构建一个必须每2秒轮询远程设备(generator fnJavascript 如何按间隔调用生成器(异步)函数,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)
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)