在没有Promise.all的情况下等待多方承诺时如何使用try-catch?

时间:2019-06-21 02:56:19

标签: javascript node.js promise

我需要执行以下操作:

let promise1 = getPromise1();
let promise2 = getPromise2();
let promise3 = getPromise3();

// some more code
...

result1 = await promise1;
// work with result1 in specific way

result2 = await promise2;
// work with result2 in specific way

result3 = await promise3;
// work with result3 in specific way

由于我需要对每个结果执行相当独特的操作,因此我不想使用Promise.all,因为它会导致某些讨厌的if-else结构。

我的问题是-try{}catch(){}阻止在哪里出现? 即使其中一个承诺错误,我也不希望它影响其他错误。无论如何,它们都必须完成执行。我应该在resultX中包装单个try{}还是将let promiseX =...包装。还是两者都有?

您是否有更好的设计模式?

谢谢!

1 个答案:

答案 0 :(得分:0)

就像您提到的那样,如果您想分别处理不同的承诺,则可以将它们包装在自己的try/catch块中。


let result1 = []; // for simplicity

try {
  result1 = await getPromise1()
} catch (error) {
  console.log(`Error occured: ${error}`);
  // fallback
  result1 = someComplicatedOperationHere();
}

您可以采用与其他n承诺相似的方法,最后您将拥有所有包含某些东西的result1 .. resultN。无论是成功的结果,还是失败的结果(或者您希望处理的结果)。

但是,请注意,如果您使用await并有多个不同的promise调用,则将为您的应用程序同步获取它们。意思是:他们会(a)wait是第一个答应返回的诺言,然后继续前进。

如果您不希望这样做,则必须使用Promise.all。 (经典的await in for loop类问题。)