为了账号安全,请及时绑定邮箱和手机立即绑定

“退货等待承诺”与“退货承诺”之间的区别

“退货等待承诺”与“退货承诺”之间的区别

牛魔王的故事 2019-11-14 09:50:48
给定下面的代码示例,行为上是否有任何差异,如果有,这些差异是什么?return await promiseasync function delay1Second() {  return (await delay(1000));}return promiseasync function delay1Second() {  return delay(1000);}据我了解,第一个将在异步函数内进行错误处理,并且错误会冒出异步函数的Promise。但是,第二个需要较少的滴答声。这个对吗?该片段只是一个返回Promise供参考的常用功能。function delay(ms) {  return new Promise((resolve) => {    setTimeout(resolve, ms);  });}
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

在大多数情况下,return和之间没有可观察到的差异return await。这两个版本的delay1Second观察行为完全相同(但根据实现的不同,该return await版本可能会使用更多的内存,因为Promise可能会创建一个中间对象)。


但是,正如@PitaJ指出的,在一种情况下存在差异:如果returnor return await嵌套在try- catch块中。考虑这个例子


async function rejectionWithReturnAwait () {

  try {

    return await Promise.reject(new Error())

  } catch (e) {

    return 'Saved!'

  }

}


async function rejectionWithReturn () {

  try {

    return Promise.reject(new Error())

  } catch (e) {

    return 'Saved!'

  }

}

在第一个版本中,异步函数在返回结果之前等待被拒绝的承诺,这将导致拒绝变成异常并到达catch子句。因此,该函数将返回一个解析为字符串“ Saved!”的promise。


但是,该函数的第二个版本确实直接返回了被拒绝的承诺,而无需在async函数中等待它,这意味着不调用该catch案例,而是由调用者获取拒绝。


查看完整回答
反对 回复 2019-11-14
?
心有法竹

TA贡献1866条经验 获得超5个赞

这是一个很难回答的问题,因为在实践中,这取决于您的编译器(可能babel)实际渲染的方式async/await。清楚的是:

  • 尽管第一个实现的链中可能少一个,但两个实现的行为应相同Promise

  • 特别是如果您删除了不必要的await,则第二个版本将不需要编译器提供任何额外的代码,而第一个版本则需要。

因此,从代码性能和调试的角度来看,第二个版本是可取的,尽管只是略微如此,而第一个版本具有一点易读性,因为它清楚地表明它返回了承诺。


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信