我知道异步/等待在本质上是相同的(至少在V8中是这样)。我已经广泛使用了,并且我注意到我越来越避免异步/等待。我还注意到,每当我被迫基于async / await编写代码时,动量就大大减少了。
•在某些情况下,异步/等待客观上是否比承诺更好?
•... ...如果没有,为什么要坚持异步/等待?
•应该使用哪个选项进行流量控制?这取决于流程的长度吗?
•如果目标是产生易于阅读和理解的代码,是否有明确的选择?
答案 0 :(得分:1)
Gokul N K 有一篇很棒的文章,我非常同意:
https://hackernoon.com/should-i-use-promises-or-async-await-126ab5c98789
从您的角度来看,我说async/await
在等待承诺解决方面就更好了(异步函数返回promises,顺便说一句)。
例如,当我调用用于操纵数据的异步函数(DB或第三方API)时,在节点环境中更频繁地使用async/await
。喜欢:
// server
async function removeComment(commentId) {
const comment = await getComment(commentId);
if (comment) {
const commentAuthorUserId = await getUser(comment.userId);
notifyUser(commentAuthorUserId);
await removedCommentFromDB(comment);
res.json({ status: 'ok' });
}
}
上面的代码不是真实的,但是显示了没有多个then
嵌套的代码看起来有多酷。顺便说一句,当您在一个try ... catch
函数中多次使用await
时(多于两次),请使用async
进行错误处理。否则,您可以使用.catch()
来等待诺言,如@Bergi所述。
另一方面,我在浏览器中使用Promises来控制流,但不处理数据。
例如:
// client
function onRemoveClick(commentId) {
service.removeComment(commentId).then(() => {
DOM.removeCommentElement(commentId);
});
}
因为如果我使用await
,它将变成:
async function onRemoveClick(commentId) {
const response = await service.removeComment(commentId);
if (response.status === 'ok') {
DOM.removeCommentElement(commentId);
}
}
这是一个相当长的时间,并且它总是可以解决HTTP响应,乍一看并不明显。