Javascript 使用wait Promise.all获得解析对象的更干净方法
考虑一系列承诺-Javascript 使用wait Promise.all获得解析对象的更干净方法,javascript,async-await,Javascript,Async Await,考虑一系列承诺-result1、result2、result3等 我等待着承诺。所有的,然后处理解决的对象。不再需要承诺 我可以使用如下的分解赋值:- [result1, result2, result3] = await Promise.all([result1, result2, result3]); 但是这里有重复([result1,result2…]使用了两次)并且它已经成熟,可以犯下大量承诺的错误 有更好的方法吗?您可以使用一个使用对象而不是数组的实用函数,大致如下: async f
result1、result2、result3等
我等待着承诺。所有的,然后处理解决的对象。不再需要承诺
我可以使用如下的分解赋值:-
[result1, result2, result3] = await Promise.all([result1, result2, result3]);
但是这里有重复([result1,result2…]使用了两次)并且它已经成熟,可以犯下大量承诺的错误
有更好的方法吗?您可以使用一个使用对象而不是数组的实用函数,大致如下:
async function allKeyed(promises) {
// Get an array of [name, value] pairs for the object's properties
const entries = Object.entries(promises);
// Wait for any thenables/promises in the values to settle
const values = await Promise.all(entries.map(([_, value]) => value));
// Build an object from those result values; this works because the
// array from `Promise.all` is in the same order as the array of
// values we gave it above.
const result = Object.fromEntries(entries.map(([key], index) => {
return [key, values[index]];
}));
return result;
}
那么它会是这样的:
const {a, b, c} = await allKeyed({
a: promise1,
b: promise2,
c: promise3,
});
…但使用有意义的名称,而不是a
、b
和c
:-)
实例:
异步函数allKeyed(承诺){
//获取对象属性的[name,value]对数组
const entries=Object.entries(承诺);
//等待价值观中的任何可选项/承诺结算
const values=wait Promise.all(entries.map([[uu,value])=>value));
//根据这些结果值构建对象;这是因为
//来自'Promise.all'的数组与的数组的顺序相同
//我们在上面给出的值。
const result=Object.fromEntries(entries.map([key],index)=>{
返回[键,值[索引];
}));
返回结果;
}
函数(值){
返回新承诺(解决=>{
设置超时(()=>{
log(`completing with${value}`);
决心(价值);
},Math.floor(Math.random()*1000));
});
}
(异步()=>{
常数{a,b,c}=wait allKeyed({
a:拿东西(“ayy”),
b:拿东西(“蜜蜂”),
c:拿东西(“见”),
});
log({a,b,c});
})()
.catch(error=>console.error(error))
对于较大的数字,您很可能不会执行反结构,而是使用完整的数组。使用相同的变量名也会让人无缘无故地感到困惑,我不介意它只是一个小数字,但我接受你的观点。有意义的名称而不是使用位置通常是有用的。因此,如果我正确理解这一点,就可以减少由于赋值两边的变量不匹配(且顺序相同)而导致错误的几率?@Ryan-它将顺序依赖替换为名称依赖,在我看来,这似乎使它更强大,当你进入超过一对夫妇。(这是基于问题的前提,即您希望单独获取它们,而不是将结果数组作为数组处理。)