对于节点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
}
}
答案 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(),它确实会返回一个诺言,当数组中的所有诺言得到解析时,该诺言就会解决;当其中一个拒绝时,它也会被拒绝。