方案在哪里异步/等待Promise?

时间:2019-02-01 18:18:00

标签: javascript asynchronous promise async-await es6-promise

我知道异步/等待在本质上是相同的(至少在V8中是这样)。我已经广泛使用了,并且我注意到我越来越避免异步/等待。我还注意到,每当我被迫基于async / await编写代码时,动量就大大减少了。

•在某些情况下,异步/等待客观上是否比承诺更好?

•... ...如果没有,为什么要坚持异步/等待?

•应该使用哪个选项进行流量控制?这取决于流程的长度吗?

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

1 个答案:

答案 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响应,乍一看并不明显。