Javascript 在哪里异步/等待超过承诺?

Javascript 在哪里异步/等待超过承诺?,javascript,asynchronous,promise,async-await,es6-promise,Javascript,Asynchronous,Promise,Async Await,Es6 Promise,我知道async/await本质上是相同的(至少在V8中是如此)。我已经广泛地使用了这两种方法,并且注意到我越来越多地避免使用async/Wait。我还注意到,每当我被迫编写基于async/await的代码时,势头会显著下降 •是否存在异步/等待客观上优于承诺的场景 •…如果不是,为什么有些人坚持异步/等待 •流量控制应使用什么选项?这是否取决于流量的长度 •如果目标是生成易于阅读和理解的代码,是否有明确的选择?Gokul N K有一篇关于这方面的精彩文章,我非常同意: 从我的观点来看,我认为

我知道async/await本质上是相同的(至少在V8中是如此)。我已经广泛地使用了这两种方法,并且注意到我越来越多地避免使用async/Wait。我还注意到,每当我被迫编写基于async/await的代码时,势头会显著下降

•是否存在异步/等待客观上优于承诺的场景

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

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


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

Gokul N K有一篇关于这方面的精彩文章,我非常同意:

从我的观点来看,我认为
async/await
在等待承诺解析方面更好(顺便说一句,异步函数返回承诺)

例如,当我调用处理数据的异步函数(DB或第三方API)时,我在节点环境中更频繁地使用
async/await
。比如:

上面的代码不是真实的,但是显示了如果没有多个
then
嵌套,代码看起来有多酷。顺便说一句,使用
试试。。。在一个
async
函数中使用
wait
多次(超过两次)时,捕获
以进行错误处理。否则,您可以对@Bergi提到的等待承诺使用
.catch()

另一方面,我使用浏览器中的承诺来控制流,但不操纵数据

例如:

// client

function onRemoveClick(commentId) {
  service.removeComment(commentId).then(() => {
    DOM.removeCommentElement(commentId);
  });
}
因为如果我使用
wait
它会变成:

async function onRemoveClick(commentId) {
  const response = await service.removeComment(commentId);

  if (response.status === 'ok') {
    DOM.removeCommentElement(commentId);
  }
}

这是一个相当长的过程,而且它总是解析一个第一眼就看不出来的HTTP响应。

无论使用什么语法,您总是使用承诺。确保您已经理解了承诺,并且
wait
仅代替
then
呼叫。几乎没有哪种情况下不使用
wait
更简单。您可能希望向我们展示一些您发现
然后
更易于使用的代码,解释您的推理,并向我们展示您如何努力获得等效的
异步
/
等待
版本的代码。@plalx不,它是promise
然后
调用的语法糖。而且它也不允许处理同步进程——但它允许使异步进程很容易按顺序进行。尝试在for循环中使用
wait
,然后尝试将其更改为严格使用承诺。这很难!“当您使用
async/await
时,请始终使用
try…catch
进行错误处理。”@Bergi您是对的,对于单个
async
调用或范围错误处理,您希望使用
catch
进行等待承诺,但它破坏了
async/await
平坦性的整体美。编辑。是的,只是说在某些情况下,您需要一个非平坦的控制流,然后
try
会成为阻碍。有时(特别是节点中的DB操作),我只是不使用这两种方法。我设置了错误处理挂钩,编写了更干净的代码,万一发生错误,服务器只返回500个错误,然后我就可以在日志中看到实际的错误
async function onRemoveClick(commentId) {
  const response = await service.removeComment(commentId);

  if (response.status === 'ok') {
    DOM.removeCommentElement(commentId);
  }
}