1 回答
TA贡献1155条经验 获得超0个赞
我有一系列的承诺,我正试图用Promise.all().
Promise.all不解决承诺(或者我认为你的意思是在这种情况下解决¹)。它允许您观察promises 被结算的结果。这不会让他们安定下来。
您的setTenants函数返回一个承诺。要使用其实现值,您必须使用.then或await(在async函数中)。请记住,截至 whensetTenants返回其承诺,已启动的操作可能尚未完成。
所以
setTenants(/*...*/)
.then(results => {
// use results...
})
.catch(error => {
// handle/report error
});
或者,在async
函数中:
const results = await setTenants(/*...*/);
(也许用try
/catch
来处理拒绝,尽管通常您只想让它传播到调用者并在那里处理它。)
旁注:then
此代码中的回调毫无意义:
return Promise.all(promises).then(res => { return res })
它应该只是:
return Promise.all(promises);
¹ 一些承诺术语:
fulfill - 将 promise 状态从pending更改为fulfilled并具有特定的fulfillment 值
reject - 将 promise 状态从pending更改为rejected并给出特定的拒绝原因
resolve - 直接(通过履行或拒绝)或间接(通过使其结果取决于另一个承诺的结果)来确定承诺的最终结果
重要的是要认识到,如果一个已解决的承诺已解决为另一个承诺并且另一个承诺处于待定状态,则该承诺仍将处于待定状态。
这是一个例子:
const p1 = new Promise(resolve => {
setTimeout(resolve, 800, 42);
});
// This could also be written: `const p2 = Promise.resolve(p1);`
const p2 = new Promise(resolve => {
resolve(p1);
});
// At this point, both `p1` and `p2` are *pending*; `p2` is *resolved to*
// `p1`, but neither `p1` nor `p2` is *settled* yet
p2
.then(value => {
// At this point, `p2` is *fulfilled* (one of the two kinds of *settled*)
console.log(value);
})
.catch(error => {
// At this point, `p2` is *rejected* (one of the two kinds of *settled*)
console.error(error);
});
添加回答
举报