当我向它添加 .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();
我是 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();