像这样在 javascript 中使用异步是否安全:
async coolFunction(users) {
const firstPromise = findPrivilegesInOneDbAsync();
const secondPromise = findPrivilegesInSecondDbAsync();
//LABEL_1
firstPromise.then(privilege=> {
users.forEach(user => {
if(user.privCode === privilege.code) {
user.privileges.push(privilege);
}
}
}
//LABEL_2
secondPromise.then(privilege=> {
users.forEach(user => {
if(user.altPrivCode === privilege.differentCode) {
user.privileges.push(privilege);
user.hasAlternativePrvis = true;
}
}
}
//LABEL_3
Promise.all([firstPromise, secondPromise]).then(() => {
console.log("DONE!");
//do something
})
}
问题是,是否保证 LABEL_3 - Promise.all 回调会在第一个和第二个 Promise(当然这两个 Promise 中的顺序并不重要)回调完成后执行?
最佳答案
...is it guaranteed that LABEL_3 - Promise.all callback gonna execute after first and second promise (order in those two of course does not matter) callbacks are done?
是的,确实如此。 Promise 上的履行处理程序按照注册顺序调用。由于您较早的项目是在 Promise.all
之前注册的,因此它们将首先运行。
示例:
function delay(ms, ...args) {
return new Promise(resolve => {
setTimeout(resolve, ms, ...args);
});
}
const promise = delay(800);
promise.then(() => {
console.log("first");
});
promise.then(() => {
console.log("second");
});
但是使用 then
返回的 promise 可能会更惯用:
async coolFunction(users) {
const firstPromise = findPrivilegesInOneDbAsync();
const secondPromise = findPrivilegesInSecondDbAsync();
Promise.all([
firstPromise.then(privilege=> {
users.forEach(user => {
if(user.privCode === privilege.code) {
user.privileges.push(privilege);
}
}
},
secondPromise.then(privilege=> {
users.forEach(user => {
if(user.altPrivCode === privilege.differentCode) {
user.privileges.push(privilege);
user.hasAlternativePrvis = true;
}
}
}
])
.then(() => {
console.log("DONE!");
//do something
});
}
这还有一个优点,那就是在执行“完成”逻辑之前等待这些履行处理程序返回的任何 promise 。
可能值得注意的是,如果您要并行执行类似的操作并使用 .then
处理程序而不是 async
,则该方法没有理由是 async
等待
。不过,您可以这样做,以保持前两件事的并行处理,但等待它们都完成:
async coolFunction(users) {
const firstPromise = findPrivilegesInOneDbAsync();
const secondPromise = findPrivilegesInSecondDbAsync();
await Promise.all([
firstPromise.then(privilege=> {
users.forEach(user => {
if(user.privCode === privilege.code) {
user.privileges.push(privilege);
}
}
},
secondPromise.then(privilege=> {
users.forEach(user => {
if(user.altPrivCode === privilege.differentCode) {
user.privileges.push(privilege);
user.hasAlternativePrvis = true;
}
}
}
])
console.log("DONE!");
//do something
}
在执行“完成”逻辑之前,这还会等待这些履行处理程序返回的任何 promise 。
关于javascript - 每个异步调用的特定任务并 promise 等待所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60182857/