【问题标题】:Promise with array is not working as expected数组的承诺没有按预期工作
【发布时间】:2019-10-08 23:42:52
【问题描述】:

我正在使用 Promise.all 函数调用 2 个函数,其中我传递了一个奇数和一个偶数。根据数字决定成败。

const time11=(t) =>{
  return new Promise((resolve,reject) =>{
   if(t%2==0){
     resolve(t)
   }else{
     reject(t)
   }
  })
}

// Promise.all
Promise.all([time11(101), time11(1210)])
 .then(result => console.log('success',result))
 .catch(error=> console.log('error',error))

我预计输出是success 1210error 101,但实际输出是error 101

【问题讨论】:

标签: javascript node.js


【解决方案1】:

Promise#allSettled

Promise.allSettled() 方法返回一个在所有给定的 Promise 都已解决或被拒绝后解决的 Promise,并带有一个对象数组,每个对象都描述每个 Promise 的结果。

const time11=(t) =>{
  return new Promise((resolve,reject) =>{
   if(t%2==0){
     resolve(t)
   }else{
     reject(t)
   }
  })
}

Promise
.allSettled([time11(101), time11(1210)])
.then(result =>console.log(result));

但是,目前仅支持few browsers。以上 sn-p 仅适用于最新版本的 chrome。

输出,看起来像这样:

[
  {
    "status": "rejected",
    "reason": 101
  },
  {
    "status": "fulfilled",
    "value": 1210
  }
]

这里是将错误与成功区分开来。

const time11=(t) =>{
  return new Promise((resolve,reject) =>{
   if(t%2==0){
     resolve(t)
   }else{
     reject(t)
   }
  })
}

Promise
.allSettled([time11(101), time11(1210)])
.then(result =>{
  const [success, errors] = result.reduce(([success, errors],cur)=>{
    if(cur.status === 'fulfilled'){
      success.push(cur);
    } else {
      errors.push(cur);
    }
    return [success, errors];
  }, [[],[]]);
  
  console.log('errors', errors);
  console.log('success', success);
});

【讨论】:

  • 您好 kemicofa,感谢您的建议,但不幸的是 Promise.allSettled 函数在节点 js 中不可用。
【解决方案2】:

Promise.all 是全有或全无。一旦数组中的所有承诺都解决了,它就会解决,或者一旦其中一个被拒绝,它就会被拒绝。换句话说,它要么使用包含所有已解析值的数组进行解析,要么以单个错误拒绝。

一些库有一个叫做 Promise.when 的东西,我理解它会等待数组中的所有承诺解决或拒绝,但我不熟悉它,它不在 ES6 中。

在这种情况下,您可以resolve 所有情况,但您必须根据then 链上的响应来管理不同的情况。

const time11=(t) =>{
  return new Promise((resolve,reject) =>{
   if(t%2==0){
     resolve(true) // Changed to boolean
   }else{
     resolve(false)  // Resolved and Boolean
   }
  })
}

// Promise.all
Promise.all([time11(101), time11(1210)])
 .then(isEven => console.log('isEven',isEven))

【讨论】:

    猜你喜欢
    • 2018-09-19
    • 2019-12-03
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2017-01-16
    • 2018-02-13
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多