使用Promise.allSettled()执行批处理的Promise

时间:2019-08-20 14:47:29

标签: node.js promise

对于节点v10.15.1,我尝试使用Promise.allSettled()来执行Promise的批处理,但它给我抛出错误

  

TypeError:Promise.allSettled不是函数

Promise.all()返回诺言吗?

下面的Main函数返回一个对象。 其他功能使用一些Promises创建其“子对象”。

为什么我需要“承诺”: 要创建子对象,必须满足所有必需的承诺。 但是“主对象”中并不需要所有子对象。

const path = require('path');
const os = require('os');
const si = require('systeminformation');

function getFoo() {
  // all these promises have to be settled to construct the sub-object
  return Promise.all([si.system(), si.chassis()]).then(([system, chassis]) => {
    return { /* hidden for brevity : use system and chassis to return a single object */ };
  })
  .catch(ex => { /* hidden for brevity */ });
}

function getBar() {
  // all these promises have to be settled to construct the sub-object
  return Promise.all([si.osInfo(), si.uuid()]).then(([osInfo, uuid]) => {
    return { /* hidden for brevity : use osInfo and uuid to return a single object */ };
  })
  .catch(ex => { /* hidden for brevity */ });
}

function getBaz() {
  // all these promises have to be settled to construct the sub-object
  return Promise.all([os.networkInterfaces(), si.networkInterfaceDefault()]).then(([interfaces, defaultInterface]) => {
    return { /* hidden for brevity : use interfaces and defaultInterface to return a single object */ };
  })
  .catch(ex => { /* hidden for brevity */ });
}

function Main() {
  // some of these promises can be rejected
  Promise.allSettled([ getFoo(), getBar(), getBaz() ])
    .then(([foo, bar, baz]) => {
      return { foo, bar, baz }
    })
    .catch(ex => { /* hidden for brevity */ });
}

Main();

预期对象的一个​​例子

{
  foo: {
    prop: 'example',
    someOtherProps: 'We are there!'
  },
  baz: {
    test: 50
  }
}

6 个答案:

答案 0 :(得分:2)

Promise.allSettled尚不适用于节点环境。作为在添加支持之前的解决方法,您可以使用npm软件包:es-shims/Promise.allSettled

答案 1 :(得分:2)

allSettled = function(promiseList) {
    let results = new Array(promiseList.length);

    return new Promise((ok, rej) => {

        let fillAndCheck = function(i) {
            return function(ret) {
                results[i] = ret;
                for(let j = 0; j < results.length; j++) {
                    if (results[j] == null) return;
                }
                ok(results);
            }
        };

        for(let i=0;i<promiseList.length;i++) {
            promiseList[i].then(fillAndCheck(i), fillAndCheck(i));
        }
    });
}

答案 2 :(得分:1)

还没有。在撰写本文时,allSettled处于第4阶段。

已计划将allSettled添加到Promise中,并使用babel和core-js@3进行填充。或者,您可以使用许多userland implementation中的一种。进入nodejs诞生可能要花费一些时间,但这并不能阻止您立即使用它。

答案 3 :(得分:1)

Promise.allSettled在节点版本> = 12.9中可用

答案 4 :(得分:1)

Update zone.js

打开package.json并将zone.js:“〜0.XX.X”更改为zone.js:“〜0.10.3”

 "dependencies": {
 "zone.js": "~0.10.3"
}

然后运行npm install

答案 5 :(得分:0)

afaik,Promise.allSettled()尚不可用。

您仍然可以使用Promise.all(),它确实会返回一个诺言,当数组中的所有诺言得到解析时,该诺言就会解决;当其中一个拒绝时,它也会被拒绝。