从异步函数返回承诺
Returning promise from async function
可以保证像下面这样 returned 吗? catch 块 return 是一个 promise 还是一个正常的错误?
async function beforeProcessing(ctx) {
try {
let res = await validateList(ctx)
return new Promise((resolve, reject) => {
if (res && res.length > 0) {
const customErr = new Error(`missing for ${res} types`);
customErr.statusCode = 422;
reject(customErr);
}
else {
resolve();
}
})
} catch (error) {
return new Error(error);
}
}
是的,但没有理由这样做。 async
履行 始终 return 承诺。只需内联处理该逻辑,然后抛出 customErr
以拒绝函数的承诺:
async function beforeProcessing(ctx) {
let res;
try {
res = await validateList(ctx)
} catch (error) {
return new Error(error); // *** This is highly suspect
}
if (res && res.length > 0) {
const customErr = new Error(`missing for ${res} types`);
customErr.statusCode = 422;
throw customErr;
}
}
但是正如我在上面的评论中提到的,returning 一个错误对象是高度可疑的,它 满足 承诺错误而不是拒绝承诺。让错误传播到调用者(这将拒绝 async
函数的承诺):
async function beforeProcessing(ctx) {
let res = await validateList(ctx)
if (res && res.length > 0) {
const customErr = new Error(`missing for ${res} types`);
customErr.statusCode = 422;
throw customErr;
}
}
此外,if
条件与错误消息相比看起来很奇怪。错误消息使条件看起来应该是 <= 0
,而不是 > 0
,但当然我可能在那里推断不正确。
可以保证像下面这样 returned 吗? catch 块 return 是一个 promise 还是一个正常的错误?
async function beforeProcessing(ctx) {
try {
let res = await validateList(ctx)
return new Promise((resolve, reject) => {
if (res && res.length > 0) {
const customErr = new Error(`missing for ${res} types`);
customErr.statusCode = 422;
reject(customErr);
}
else {
resolve();
}
})
} catch (error) {
return new Error(error);
}
}
是的,但没有理由这样做。 async
履行 始终 return 承诺。只需内联处理该逻辑,然后抛出 customErr
以拒绝函数的承诺:
async function beforeProcessing(ctx) {
let res;
try {
res = await validateList(ctx)
} catch (error) {
return new Error(error); // *** This is highly suspect
}
if (res && res.length > 0) {
const customErr = new Error(`missing for ${res} types`);
customErr.statusCode = 422;
throw customErr;
}
}
但是正如我在上面的评论中提到的,returning 一个错误对象是高度可疑的,它 满足 承诺错误而不是拒绝承诺。让错误传播到调用者(这将拒绝 async
函数的承诺):
async function beforeProcessing(ctx) {
let res = await validateList(ctx)
if (res && res.length > 0) {
const customErr = new Error(`missing for ${res} types`);
customErr.statusCode = 422;
throw customErr;
}
}
此外,if
条件与错误消息相比看起来很奇怪。错误消息使条件看起来应该是 <= 0
,而不是 > 0
,但当然我可能在那里推断不正确。