【问题标题】:Is given async function and .then() is different or not被赋予异步函数并且 .then() 是否不同
【发布时间】:2020-01-09 08:03:10
【问题描述】:

给定两种语法的工作方式是相同还是不同?

functionName.then((data) => {console.log(data)})
            .catch((e) => {console.log(e)});

(async () => {
   let data = (await client.function(input));
   console.log(data);
})().catch(e => {
    console.log(e);
});     

【问题讨论】:

  • 一个用functionName,另一个用client.function(input)?
  • 在你的第二个例子中你可以使用try..catch

标签: javascript node.js function syntax async-await


【解决方案1】:

虽然 输出 将相同,但这两者在 JavaScript 运行时中的操作会略有不同。

第一个 Promise 示例中的 then 处理函数在 async 示例中不存在。虽然差异很小,但它就在那里。 then 函数将被添加到事件循环调用堆栈中,而在异步示例中,await 调用在运行时的较低级别处理。

另外,命名函数(functionName)表示该函数已自行保存到内存中,在第二个示例中,对象与方法一起使用,这是不同的,意味着不同的内存使用情况。此外,第二个示例将所有内容包装在 IIFE 中(以断言 async 性质),这又增加了一层和差异。

【讨论】:

  • 还有很多很多细微的差别,但我怀疑这些对 OP 来说是否重要。
【解决方案2】:

是的,await 的工作方式非常类似于 then 调用,在这个简单的示例中它们是等价的。

【讨论】:

  • 他们不是。在第一个 Promise 示例中有一个额外的函数定义。虽然差异很小,但它就在那里。该函数将被添加到事件循环调用堆栈中,而在异步示例中,await 调用在运行时的较低级别处理。此外,命名函数 (functionName) 表示该函数已自行保存到内存中,在第二个示例中,对象与方法一起使用,这是不同的。此外,第二个示例将所有内容都包装在一个 IIFE 中,这又增加了一层和差异。
  • @jakerella 对于这样一个基本的问题,答案当然简化了很多。当然,两个不同的代码在细节上总是做不同的事情,但在这里它们具有相同的效果和结果。这就是OP想知道的。关于functionName,我只是认为这是操作部分的失误,他打算像另一个例子一样写client.function(input)
  • 当然,但这不仅仅是关于 OP 的问题,还与其他人找到这个答案有关。您说它们“绝对等效”,但这绝对不是真的。也就是说,您对基本执行是正确的。如果您编辑答案以不包含“绝对等效”,那么我认为没关系。
  • @jakerella 完成。您可以自己编辑它,这是一个社区 wiki 答案 :-) “绝对”来自我的想法,虽然 await 可以在这里简单地替换为 then(使它们等效),但并非总是如此( await 内部控制结构)。
  • 啊,那是公平的......我想我不喜欢在早期编辑别人的作品。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2020-11-06
  • 2018-10-07
  • 2019-04-17
  • 1970-01-01
  • 2020-09-25
相关资源
最近更新 更多