javascript - 场景在哪里异步/等待 promise ?

标签 javascript asynchronous promise async-await es6-promise

<分区>

我知道 async/await 在本质上是相同的(至少在 V8 中是这样)。我已经广泛使用了两者,并且我注意到我越来越多地避免异步/等待。我还注意到,每当我被迫编写基于 async/await 的代码时,动力都会显着下降。

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

• ...如果不是,为什么有些人坚持异步/等待?

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

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

最佳答案

Gokul N K 发表了一篇很棒的文章,我非常同意:

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

从我的 Angular 来看,我会说 async/await 在等待 promise 解析方面更好(异步函数返回 promises,顺便说一句)。

例如,当我调用操作数据(数据库或第 3 方 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 嵌套的代码看起来多么酷。顺便说一句,当您在一个 async 函数中多次(超过两次)使用 await 时,请使用 try ... catch 进行错误处理。否则,您可以使用 .catch() 作为 @Bergi 提到的 await promise。

另一方面,我在浏览器中使用 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 响应。

关于javascript - 场景在哪里异步/等待 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54485072/

相关文章:

javascript - Arbor.js 查询

javascript - 在响应式触摸设备中,复选框和单选按钮可从外部区域单击,如何解决这个问题?

javascript - 在 Node.js 脚本 for 循环中使用 Promise 时出现问题

javascript - catch block 中的 resolve 未定义

javascript - 在延迟对象解析后执行 Thenable 函数

javascript - 使用 Javascript DOM 删除 HTML 中的无序列表

javascript - 在 Javascript 中使用 DJango 模板标签添加 Google map 标记

javascript - 如何执行多个异步函数(非嵌套)以提高性能,但要等待它们完成后再继续

javascript - 如何从异步调用返回响应?

javascript - 基于 Promise 的递归目录读取