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-它将顺序依赖替换为名称依赖,在我看来,这似乎使它更强大,当你进入超过一对夫妇。(这是基于问题的前提,即您希望单独获取它们,而不是将结果数组作为数组处理。)