【发布时间】:2018-11-20 12:19:33
【问题描述】:
我试图弄清楚为什么这段代码不起作用。我正在循环一个依赖树(deepObject),并且对于每个我想运行一个返回承诺的函数。然后,我希望在解决所有承诺之后发生下一组功能,但是 promise.all 中的控制台日志没有执行。 ES6 也很酷,如果你有更好的方法,但是我也很想知道为什么这段代码不起作用。
更新为添加.catch(这没有效果)
for (let i = 0; i < keys.length; i++) {
promisesArray.push(promiseFunction(deepObject[keys[i]]));
}
Promise.all(promisesArray).then(resolved => {
console.log('dep promises resolved');
console.log(`resolved: ${JSON.stringify(resolved)}`);
}).catch(err => console.error(new Error(err));
// promiseFunction is recursive
promiseFunction(obj) {
return new Promise((resolve, reject) => {
const keys = Object.keys(deepObj);
for (let j = 0; j < keys.length; j++) {
if (Object.keys(deepObj[keys[j]]).length) {
// adding return statement to following line breaks it
// that was already recommended, see threads
promiseFunction(deepObj[keys[j]]);
} else {
const dep = new Package(keys[j]);
console.log(`skan dep: ${keys[j]}`);
dep.fetch().then(() => {
return anotherFunction();
}).then(() => {
return Promise.all([
promise1(),
promise2(),
promise3(),
]).then(resolved => {
if (resolved[0].propertyINeed) {
resolve(true);
}
resolve(false);
});
}).catch(err => {
console.error(new Error(err));
process.exit(1);
});
}
}
});
我知道这个对话 - has been discussed - on here before
在上面的第二个链接中,接受的答案建议:
如果您异步填充数组,您应该获得该数组的承诺,并使用 .then(Promise.all.bind(Promise))。如果您不知道何时停止添加 Promise,那么无论如何这都是不可能的,因为它们可能永远都不会被解决。
但是我没有使用异步来填充数组。我需要这个吗?我在这里错过了什么?
更新
由于我现在在 .then() 和 .catch() 中都有错误记录,因此似乎出现了与其中发生的事情无关的问题。
在promiseFunction(deepObj[keys[j]]); 之前添加return 语句会破坏递归。我从 173 个对象迭代到 68 个对象。添加 catch 没有记录额外的结果。上面的代码已更新以共享更多递归 fn。当我运行它时,它似乎执行了所有的承诺,但我无法知道这一点。我最关心的是知道 1. promise.all 的 promise 数组包含它应该包含的所有对象,以及 2. 抓住递归对象中所有对象的所有这些 promise 都已解决的时刻。
此外,为了记录,这些返回承诺的函数中的每一个都必须是异步的。我已经多次回顾所有这些,试图简化和删除任何不必要的承诺。任务很复杂。有一系列步骤必须执行,它们是异步的,并且它们是链式的,因为它们必须按特定顺序解决。
【问题讨论】:
-
尝试控制台记录拒绝功能,看看是否有问题
-
"promiseFunction 为简洁省略" — 不要那样做。你不需要提供真实的东西,但你需要提供minimal reproducible example。我已经猜到哪些代码可能会出现在丢失的地方,但我无法重现该问题:jsbin.com/fesudezuja/1/edit?js,console
-
试试
Promise.all(promisesArray).then(...).catch(err => console.error('Failed', err))。 -
在
promiseFunction中,if 语句的第一个块应该return第二个promiseFunction的结果 - 否则它不会解决任何问题!
标签: javascript asynchronous promise