gpt4 book ai didi

javascript - Promise 无法通过 setTimeOut 的递归函数解析

转载 作者:行者123 更新时间:2023-11-28 14:29:54 24 4
gpt4 key购买 nike

我想在循环中经过一定延迟后执行一些代码。一旦完成所有迭代,我想做一些其他任务。这些取决于从任务 1 获得的结果。为此,我使用生成器、异步/等待和 promise 编写了以下代码片段:

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() 中的控制台永远不会被打印。这意味着 promise 永远不会得到解决并且程序终止。迭代按预期执行,但 promise 永远不会解决。这里可能出了什么问题?我使用递归来触发 iterator.next() 并希望仅在最后一次迭代(即 did=true 时)解决 promise 。

这个问题让我很头疼。感谢帮助。以下是该程序的输出。

enter image description here

最佳答案

几个问题:线路

var p = await cb1(myIter);

结果为p被分配调用 cb1 的结果的p不是 Promise除非构造Promise 解析Promise这也是不寻常的。因为await本质上暂停脚本的执行,直到 promise 解决,您不需要 .then - 您只需添加console.log下面在 start功能。一旦你将这些 promise 正确地链接在一起,p将解析为 'done'字符串 ,这当然不是 Promise .

但是还有一个问题:你的 promise 由 cb1 返回永远不会解决,除非在最后,你调用 resolve 。在 else ,你永远不会调用resolve ,所以这些 promise 永远悬而未决。要解决此问题,请更改

  } else {
console.log("---in else---");
cb1(myIter);
}

  } else {
console.log("---in else---");
cb1(myIter).then(resolve);
}

这样当前迭代的Promise一旦下一个迭代的 Promise 就解析解决了。​​

function* iter() {
for (var i = 0; i < 3; i++) yield i
}

async function start() {
var myIter = iter();
var p = await cb1(myIter);
console.log('after await');
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).then(resolve);
}
}, 1000);
});
}

关于javascript - Promise 无法通过 setTimeOut 的递归函数解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51872491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com