猿问

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

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


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);

  });

}


牛魔王的故事
浏览 244回答 3
3回答

互换的青春

在大多数情况下,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案例,而是由调用者获取拒绝。

心有法竹

这是一个很难回答的问题,因为在实践中,这取决于您的编译器(可能babel)实际渲染的方式async/await。清楚的是:尽管第一个实现的链中可能少一个,但两个实现的行为应相同Promise。特别是如果您删除了不必要的await,则第二个版本将不需要编译器提供任何额外的代码,而第一个版本则需要。因此,从代码性能和调试的角度来看,第二个版本是可取的,尽管只是略微如此,而第一个版本具有一点易读性,因为它清楚地表明它返回了承诺。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答