gpt4 book ai didi

javascript - Resolved promise 等待内在的 promise 被解决

转载 作者:行者123 更新时间:2023-11-30 09:30:02 25 4
gpt4 key购买 nike

我想要一个对 promise 的 promise ,像这样:

let first = new Promise(resolveFirst => {
setTimeout(() => {
resolveFirst("resolved!");
}, 2000)
});

let second = new Promise(resolveSecond => {
setTimeout(() => {
resolveSecond(first);
}, 10)
});

second.then(secondValue => {
console.log("second value: ", secondValue);
secondValue.then(firstValue => {
console.log("first value: ", firstValue);
});
});

因此 console.log("second value: ", secondValue);10 之后打印,然后是 console.log("first value: ", firstValue) 之后将打印 2000

不过我得到了:

second value: resolved!

还有一个错误:

Uncaught (in promise) TypeError: secondValue.then is not a function

2010 千年后在一起。

似乎当第二个 promise 被解决,第一个 promise 被返回时,它会自动等待第一个 promise 也被解决。

这是为什么呢?我该如何打破它们?


编辑

这是使用 Array.reduce() 发布在 facebook 上的解决方案:

const runPromisesInSeries = 
ps => ps.reduce((p, next) =>
p.then(next), Promise.resolve());

const delay = d => new Promise(r => setTimeout(r, d));
runPromisesInSeries([() => delay(1000), () => delay(2000)]);
//executes each promise sequentially, taking a total of 3 seconds to complete

( https://www.facebook.com/addyosmaniofficial/photos/a.10151435123819601.1073741825.129712729600/10155386805609601/?type=3&theater )

最佳答案

根据设计,在第二个 promise 结算(完成或拒绝)后,用第二个 promise 解决的 promise 采用第二个 promise 的值和状态,等待它根据需要结算。

除非 promise 库存在严重缺陷(旧版本的 JQuery 会实现自己的promise 对象与来自不同库的 promise 对象)。

Promise rejection 没有相同的检查,并且会愉快地将 promise 对象传递到链中,而无需等待它被解决。因此,您可以拒绝第一个 promise 的第二个 promise ,并在 catch 子句中选择它。

虽然技术上可行,但我强烈建议不要这样做,除非证明它可以完成 - 对于试图理解代码的第三方来说,这是一个维护问题。

虽然您可以将 promise 作为对象属性传递到 promise 链的成功 channel 中,但重新分析 promise 组合可能会提供更好或更标准的解决方案。例如。 Promise.all 等待两个或多个独立的 promise 在继续执行共同任务之前得到履行。

关于javascript - Resolved promise 等待内在的 promise 被解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46867915/

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