gpt4 book ai didi

javascript - Js Promise.all 没有正确返回

转载 作者:行者123 更新时间:2023-12-03 08:26:23 24 4
gpt4 key购买 nike

我有几个函数想通过 Promises(loadA、loadB、loadC)并行执行。

Promise.all([
new Promise(loadA),
new Promise(loadB),
new Promise(loadC)
])
.then(checkFunction)
.catch(errorHandler);

函数如下:

function loadA(){
return load("A");
}

其中 A 在适当的地方被 B 和 C 代替。加载函数为:

function load(value) {
return new Promise(function(resolve, reject) {
chrome.storage.sync.get(value, function (result) {
if(!exists(result)){
console.log("tried to fetch " + value + " from sync, could not find");
reject("could not find the user information");
} else {
console.log("fetched " + value + " from sync: " + result.userId);
resolve(result);
}
});
})
}

```

我正在做一些测试,当加载函数发送 Promise reject 时,出现了问题。函数“next-in-line”是 checkFunction,它没有被调用,errorHandler 函数也没有被调用。我已经确认 load promise 实际上被拒绝了,因为控制台显示了 3 个“试图获取...”语句。

我也不明白为什么我会看到 3 个 tried to fetch.. 语句,因为 Promise.all 的规范声明它会在其中一个 promise 被拒绝时立即返回,或者毕竟 promise 已解决(来源:http://mzl.la/1jLTOHB)。我观察到的行为与这两种情况都不匹配,我可能做错了什么?

最佳答案

你的加载函数已经创建并返回了一个 promise ,在我看来你只是想要这个:

Promise.all([
loadA(),
loadB(),
loadC()
])
.then(checkFunction)
.catch(errorHandler);

按照您构建代码的方式,您正在启动三个并行运行的操作以加载“A”、“B”和“C”。这三个操作独立运行,因此您会看到三个“试图获取...”消息(一个来自每个操作内部)。只有在这三个独立操作之外,Promise.all() 才会查看解决/拒绝状态并决定下一步做什么。


事实上,您可以简化为:

Promise.all([
load("A"),
load("B"),
load("C")
])
.then(checkFunction)
.catch(errorHandler);

按照您的方式,您创建的外部 promise 从未得到解决或拒绝,因此 .then().catch() 从未被触发。只是,您的 load() 函数中的内部 promise 得到了解决或拒绝。

关于javascript - Js Promise.all 没有正确返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24415739/

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