Nodejs promise 批量 settle 执行结果如何使用参数

发布于 1周前 作者 htzhanglong 来自 nodejs/Nestjs

Nodejs promise 批量 settle 执行结果如何使用参数

node.js 有一个批量异步处理,在 bluebird settle 执行完还需要使用 id 咋办,请问如何获取?

var queries = array.map(function(id){
    return User.schema.find({user_id: id}).execAsync();
});
return Promise.settle(queries).then(function(results){
    results.forEach(function(result){
        if(result.isFulfilled()){
            //这里如何使用 map 遍历时的 id ?
            
        }else if(result.isRejected()){
            error(result.reason());
        }
    });
});

settle 是异步执行在外面定义一个变量临时存储 id 好像不行吧,如果是闭包倒是可以在每个异步执行完获取 id ,因为在同一个 function 作用域。


3 回复

var queries = array.map(function(id){
return User.schema.find({user_id: id}).execAsync();
});
==>
var queries = array.map(function(id){
return User.schema.find({user_id: id}).execAsync().then(data => {
return {id: id, data: data}
});
});
这样就好了…


Got it , thanks 。

在 Node.js 中处理 Promise 的批量 settle(即等待所有 Promise 完成,无论成功还是失败),你可以使用 Promise.allSettled() 方法。这个方法返回一个在所有给定的 Promise 都已经 fulfilled 或 rejected 后的新 Promise,并且这个新 Promise 的结果是一个对象数组,每个对象表示一个 Promise 的结果。

下面是一个如何使用 Promise.allSettled() 并处理结果的示例代码:

// 示例 Promise
const promise1 = Promise.resolve(42);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'error'));
const promise3 = Promise.resolve('Hello, World!');

// 使用 Promise.allSettled()
Promise.allSettled([promise1, promise2, promise3])
  .then((results) => {
    results.forEach((result) => {
      if (result.status === 'fulfilled') {
        console.log(`Fulfilled with value: ${result.value}`);
      } else if (result.status === 'rejected') {
        console.log(`Rejected with reason: ${result.reason}`);
      }
    });
  });

在这个例子中,我们创建了三个 Promise,其中一个是被拒绝的。Promise.allSettled() 会等待这三个 Promise 都完成,然后返回一个包含每个 Promise 结果的对象数组。每个对象都有一个 status 属性(值为 'fulfilled''rejected')以及一个 valuereason 属性,分别表示 Promise 的值或拒绝原因。

通过这种方式,你可以批量处理 Promise 的结果,并根据每个 Promise 的状态(成功或失败)来采取不同的行动。

回到顶部