小编典典

`return await promise` and `return promise`之间的区别

javascript

给定下面的代码示例,行为上是否有任何差异,如果有,这些差异是什么?

return await promise

async function delay1Second() {
  return (await delay(1000));
}

return promise

async function delay1Second() {
  return delay(1000);
}

据我了解,第一个将在异步函数中进行错误处理,并且错误将从异步函数的Promise中冒出来。但是,第二个需要较少的滴答声。它是否正确?

此片段只是返回Promise供参考的常用功能。

function delay(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

阅读 259

收藏
2020-05-01

共1个答案

小编典典

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

但是,正如@PitaJ指出的,在一种情况下存在差异:如果returnorreturnawait嵌套在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案例, 而是由调用者获取拒绝。

2020-05-01