【发布时间】:2019-01-23 03:28:32
【问题描述】:
我想在循环中经过一定的延迟后执行一些代码。一旦所有的迭代都完成了,我想做一些其他的任务。这些取决于从 task1 获得的结果。为此,我使用生成器、async/await 和 promise 编写了以下代码 sn-p:
function* iter() {
for (var i = 0; i < 10; i++) yield i
}
async function start() {
var myIter = iter();
var p = await cb1(myIter);
console.log('after await');
p.then((value) => {
console.log('-----------here-------------');
});
}
start();
function cb1(myIter) {
console.log("Started : " + new Date());
var obj;
return new Promise((resolve, reject) => {
setTimeout(function(){
if(myIter.next().done === true) {
console.log("End : " + new Date());
resolve('done');
}else {
console.log("---in else---");
cb1(myIter);
}
}, 3000);
});
}
问题是,p.then() 中的控制台永远不会被打印出来。这意味着承诺永远不会得到解决并且程序终止。迭代按预期执行,但承诺永远不会解决。这里有什么问题?我正在使用递归来触发 iterator.next() 并希望仅在最后一次迭代时解决承诺,即当 done=true 时。
很久以来就在这个问题上摸不着头脑。帮助表示赞赏。以下是该程序的输出。
【问题讨论】:
标签: javascript recursion promise async-await generator