【发布时间】:2018-01-03 01:47:58
【问题描述】:
将 Promise 的回调定义为异步似乎存在本质上的错误:
return new Promise(async (resolve, reject) => {
const value = await somethingAsynchronous();
if (value === something) {
return resolve('It worked!');
} else {
return reject('Nope. Try again.');
}
});
这显然是一个antipattern,并且有编码problems which can arise from it。我知道,即使将 await 语句放在 try/catch 块中,也更容易在此处捕获错误。
我的第一个问题是,当人们想要转发具有不同解析/拒绝值的 Promise 时,编写这样的代码的最佳方式是什么?用 then/catch?即
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
});
还是按照here 的建议将其完全取出 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?它已经封装在一个 Promise 中,并期望异步调用解析/拒绝函数。
【问题讨论】:
-
始终牢记,基本上仅次需要
new Promise是如果您正在与使用回调的不同API 进行互操作。
标签: javascript asynchronous ecmascript-6 promise async-await