当前位置: 首页 > 面试题库 >

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

萧安怡
2023-03-14
问题内容

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

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

问题答案:

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



 类似资料:
  • 问题内容: 和之间有什么区别? 我曾经使用,但是它不允许我向其中添加元素,而确实可以。 问题答案: extends 通配符声明意味着以下任何一项都是合法转让: Reading -根据上述可能的任务,可以保证从中读取哪种类型的对象List foo3: 你可以阅读,Number因为任何可以分配为包含或的子类的列表Number。 你看不到,因为它可能指向。 你看不到因为它可能指向。 Writing -鉴

  • 问题内容: 之间有什么区别 例如: 如果我使用一个或另一个真的有关系吗? 问题答案: 基本上destroy在模型上运行任何回调,而delete实际上不运行。 从Rails API中: 删除数据库中的记录并冻结该实例以反映不应进行任何更改(因为它们不能持久保存)。返回冻结的实例。 只需在记录的主键上使用SQL DELETE语句删除该行,就不会执行任何回调。 要强制执行对象的回调或任何:关联选项,请使

  • 问题内容: SQL解释逻辑运算符和的方式是否有所不同? 问题答案: 对于mySQL:手册未明确说明,但它们被列为相同: AND, && 逻辑与。如果所有操作数都不为零且不为NULL,则计算为1;如果一个或多个操作数为0,则计算为0,否则返回NULL。 该运算符优先级页面也没什么distiction。

  • 问题内容: 侵入性和非侵入性javascript有什么区别?简洁被赞赏。简短的例子也值得赞赏。 问题答案: 我已经不再支持它了,因为它在2011年有效,但在2018年及以后不再有效。 关注点分离。 您的HTML和CSS不受JS代码的束缚。您的JS代码未嵌入某些HTML元素。您的代码没有所有功能都具有一个大功能(或没有功能)。您具有简短的功能。 模块化。 当您正确分离关注点时,就会发生这种情况。例如

  • 问题内容: 和之间有什么区别 例如,当你查看类时,构造函数具有以下签名: 对于方法之一: 问题答案: 第一个说是“是E的祖先的某种类型”。第二个说是“某种类型,它是E的子类”。(在两种情况下,本身都可以。) 因此,构造函数使用该? 形式,以确保在从集合中获取值时,它们将全部为E或某个子类(即,它是兼容的)。该方法试图将值放入集合中,因此集合必须具有 或超类的元素类型。 例如,假设你有一个这样的类层

  • 问题内容: 使用和调用函数有什么区别? 与 前述两种方法之间是否存在性能差异?什么时候最好使用over ,反之亦然? 问题答案: 不同之处在于,您可以使用数组作为函数来调用函数。需要明确列出参数。有用的助记是 “ 甲用于 一个rray和ç为 ÇOMMA”。 有关apply和call的信息,请参见MDN的文档。 伪语法: 从ES6开始,数组也可以与该函数一起使用,您可以在此处查看兼容性。 样例代码: