必须将 Promise 的回调定义为异步似乎存在一些固有的错误:
return new Promise(async (resolve, reject) => {
const value = await somethingAsynchronous();
if (value === something) {
return resolve('It worked!');
} else {
return reject('Nope. Try again.');
}
});
这显然是一种 反模式, 可能会产生编码问题。据我所知,即使将 await
语句放在 try
/ catch
块中,也更容易捕获错误。
我的第一个问题是,当一个人想要转发具有不同解析/拒绝值的 Promise 时,编写这样的代码的最佳方法是什么?然后/抓住? IE
return new Promise((resolve, reject) => {
somethingAsynchronous().then(value => {
if (value === something) {
return resolve('It worked!');
} else {
return reject('Nope. Try again.');
}
}); // errors would now be propagated up
});
还是按照 此处 的建议将其完全从 Promise 构造函数中取出?
async function outerFunction() {
const value = await somethingAsynchronous();
return new Promise((resolve, reject) => {
if (value === something) {
return resolve('It worked!');
} else {
return reject('Nope. Try again.');
}
});
}
但是,如果您在 outerFunction() 中有多个 await 语句,即调用多个异步函数的线性代码块怎么办?那么你每次都必须创建并返回一个新的 Promise 吗?
但是你如何解释这样的代码呢?
async function outerFunction() {
if (someSynchronousCheck()) {
return 'Nope. Try again.' // another reject case
}
const value = await somethingAsynchronous();
// ...
}
我觉得我正在使它变得比它应该的更复杂。我试图避免嵌套回调/链接 then/catch 块,而不会在将来产生更多问题。
我的最后一个问题是,为什么回调传递给 Promise 不是固有的 async
?它已经包装在一个承诺中,并期望异步调用解析/拒绝函数。
原文由 Druckles 发布,翻译遵循 CC BY-SA 4.0 许可协议
你来做这件事:
使用
async
outerFunction
用 Promise 包装 — 的结果。如果您希望包装承诺解决某些问题,只需从
async
函数返回它。如果您希望包装承诺被拒绝,请在async
函数中抛出一个错误。