当我向它添加 .catch 时,承诺是否已解决?

Is a promise resolved when I add .catch to it?

我是 typescript 的新手/javascript,所以我对 promises 了解不多。这是我的用例:我在我的云函数中创建了三个不同的承诺,然后 return 使用 Promise.all([promise1, promise2, promise3]). 对它进行了处理,每个承诺都是在具有“return Promise 的函数中创建的...".

我的问题是,当我在这些函数中添加“.catch”时,Promise.all 仍然有效吗?使用和不使用 .catch() returning someServiceThatCreatesPromise() 有什么不同吗?

代码

export async function myCloudFirestoreFunction() {
   try  {
        const myFirstPromise = createFirstPromise()
        const mySecondPromise = createSecondPromise()
        const thirdPromise = createThirdPromise()

        return Promise.all([
          myFirstPromise,
          mySecondPromise,
          myThirdPromise
       ]);
   } catch (err) {
       functions.logger.err(`Something bad happened, See: ${(err as Error).message}`
   }
}

// Difference with and without `.catch`?
function createFirstPromise() {
   return someServiceThatCreatesPromise().catch((err) => { // LOGGING });
}

// Difference with and without `.catch`?
function createSecondPromise() {
   return someServiceThatCreatesPromise().catch((err) => { // LOGGING });
}

// Difference with and without `.catch`?
function createThirdPromise() {
   return someServiceThatCreatesPromise().catch((err) => { // LOGGING });
}

when I add ".catch" inside these functions, will Promise.all still work?

对承诺调用 catch() 不会以任何方式改变原始承诺的工作方式。它只是附加一个回调,当第一个承诺被拒绝时被调用,并且还返回另一个在原始承诺被履行或拒绝后解析的承诺。

Does it make any difference returning someServiceThatCreatesPromise() with and without .catch()?

这对依赖于返回的承诺的代码没有任何影响。原始承诺和 catch() 返回的承诺都会在原始工作完成时告知下游代码。

我建议阅读有关 promises 的综合文档,例如:

其中有一个图表,您可以按照该图表了解每个回合发生的情况。同样在该文档中,您将阅读:

Processing continues to the next link of the chain even when a .then() lacks a callback function that returns a Promise object. Therefore, a chain can safely omit every rejection callback function until the final .catch().

createNPromise 中添加 .catch 不会影响任何事情,前提是你所有的 Promise 都解决并且不拒绝。

但是,如果 Promise 之一拒绝并且您在 .catch 方法中捕获它,那么它不会像您期望的那样工作,除非您重新抛出该错误并在 myCloudFirestoreFunction 函数的 try/catch 中再次捕获它。

async function myCloudFirestoreFunction() {
  try {
    const result = await Promise.all([
      createFirstPromise(),
      createSecondPromise()
    ]);
  } catch (error) {
    console.log({ error });
  }
}

function createFirstPromise() {
  return Promise.reject("Oof").catch((e) => {
    // do work, e.g. log, then
    // pass the error forward so that it can be caught
    // inside the caller
    throw e;
  });
}

function createSecondPromise() {
  return Promise.resolve("value");
}

myCloudFirestoreFunction();

或者,您只是 catch 调用者内部的错误 (myCloudFirestoreFunction) 而不是单独捕获它们。

async function myCloudFirestoreFunction() {
  const result = await Promise.all([
    createFirstPromise(),
    createSecondPromise()
  ]).catch((err) => console.log({ err }));
}

function createFirstPromise() {
  return Promise.reject("Oof");
}

function createSecondPromise() {
  return Promise.resolve("value");
}

myCloudFirestoreFunction();