【发布时间】:2021-06-07 03:44:27
【问题描述】:
我正在尝试创建一个 promise 数组,以便我可以批量处理 promise 而不是一起执行它们以避免关闭我的服务器。我想一次执行最多 20 个承诺。 我写了以下代码:
let promises = [];
let create;
let update;
let i=0;
let users = users.json;
if (users && usersjson.users.length) {
for (const user of users) {
if (userexists) {
update = new promise(async (resolve,reject) => {
//Function to update user
});
promises.push(update);
i++;
} else {
create = new promise (async (resolve,reject) => {
//Function to create a new user
});
promises.push(update);
i++;
}
if (promises.length >= 20 || i >= usersjson.users.length) {
await Promise.all(promises)
.then((response)=>{
console.log(response);
promises=[];
}).catch((err)=> {
console.log(err);
})
}
}
}
但是,我发现promise是在我定义它们的时候执行的,而不是在我调用Promise.all时被压入数组并执行,我不知道为什么。
我还希望 Promise.all 函数继续运行,即使单个 Promise 被拒绝,如果我的代码构建方式可行的话。如果代码失败,我在每个承诺中都有一个问题,这是正确的方法吗?
【问题讨论】:
-
Promise 不是稍后触发的东西。一个promise只是标记已经有一个操作正在运行并且一个值挂起。它作为值可用时的通知机制。
-
所以为了做到这一点,我需要更改所有对函数的承诺并将它们推送到数组中?
-
Promise 不会在你“定义”它们时执行,也不会在你调用
Promise.all()时执行,但是当它们从执行堆栈中取出时它们会被执行。如果你不想拒绝Promise.all()拒绝,当一个承诺被拒绝时,你将不得不抓住每个承诺的拒绝。但是当然你必须检查结果数组 -
我看到它多次提到,所以为了消除混淆 - 承诺没有“执行”。执行一个异步任务返回一个promise。承诺不是任务本身,它不是“运行”或类似的东西。当您订购比萨饼并获得收据时,制作比萨饼的不是收据。您的披萨是由其他人在其他地方制作的 - 收据只是确认您的订单已被接受。当您的号码在比萨制作过程结束时被呼叫时,这就是承诺通知机制。你可以
.then(pizza => goHomeWith(pizza)).then(eat)
标签: node.js arrays async-await promise promise.all