javascript – 在Promise上异步/等待的场景?

参见英文答案 >
What is the difference between JavaScript promises and async await?                                    6个

我知道异步/等待在引擎盖下基本相同(至少在V8中).我已广泛使用这两个,我注意到我避免异步/等待越来越多.我还注意到,每当我被迫编写基于async / await的代码时,动量就会显着下降.

•是否存在async / await客观上优于Promises的情况?

•…如果没有,为什么有些人坚持异步/等待?

•流量控制应该使用什么选项?这取决于流量的长度吗?

•如果目标是生成易于阅读和理解的代码,是否有明确的选择?

最佳答案 关于Gokul N K的一篇很棒的文章,我几乎同意这一点:

https://hackernoon.com/should-i-use-promises-or-async-await-126ab5c98789

从我的角度来看,我会说async / await在等待promise解析方面更好(异步函数返回promises,btw).

例如,当我调用操作数据的异步函数(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' });
  }
}

上面的代码不是真实的,但显示代码看起来有多酷,没有多个嵌套.顺便说一句,当你在一个异步函数中使用等待多次(超过两次)时,使用try … catch进行错误处理.否则,您可以使用.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响应,这在第一眼看上去并不明显.

点赞