... гарантируется ли, что обратный вызов LABEL_3 - Promise.all будет выполнен после выполнения первого и второго обещаний (порядок в этих двух, конечно, не имеет значения) обратных вызовов?
Да, это так. Обработчики исполнения обещания вызываются в порядке регистрации. Так как ваши предыдущие были зарегистрированы до ваших 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");
});
Но, вероятно, было бы более идиоматически c использовать вместо этого обещания, возвращаемые then
:
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
});
}
Это также имело бы Преимущество ожидания любых обещаний, возвращаемых этими обработчиками выполнения, перед выполнением логики «done» c.
Вероятно, стоит отметить, что нет причин для того, чтобы этот метод был async
, если вы ' мы собираемся делать подобные вещи параллельно и использовать обработчики .then
вместо await
. Вы могли бы сделать это, однако, чтобы сохранить обработку первых двух вещей параллельно, но ждать, пока они оба завершатся sh:
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
}
Это также будет ждать любых обещаний, возвращаемых этими обработчиками выполнения перед выполнением логики "done" c.