我正在构建一个必须每2秒轮询远程设备(生成器fn sendRequests()
)的应用程序。
使用setInterval调用生成器fn的正确方法是什么,setInterval不是生成器而且不会产生
function * sendRequests() {
// multiple remote async requests are sent
}
var timer = setInterval(() => {
// yield sendRequests()
}, 2000)
答案 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或更高版本中使用而没有任何标志。