【发布时间】:2018-04-04 16:13:16
【问题描述】:
问题:与 a常规函数的返回语句?
async function foo() {
var x = await bar(); // <--- bar() is non-blocking so await to get the return value
return x; // the return value is wrapped in a Promise because of async
}
对比
function foo() {
var x = bar(); // <--- bar() is blocking inside its body so we get the return value
return new Promise(resolve => { resolve(x); }); // return a Promise manually
}
上下文:
由于 Javascript(也就是 Nodejs)采用的异步方向,为什么他们默认不认为每个函数都是异步的(根据 async 关键字)?
这样,人们可以决定将任何函数调用视为 Promise 并玩异步游戏,或者只是 await 什么是必要的。
我认为函数体内的await-ing 会产生堆叠本地函数作用域的开销,而正常的事件循环在函数返回时继续进行,并且不必将内部函数作用域推入堆栈?
这归结为一个额外的问题:在一个复杂的类层次结构中(某处很深)需要一个同步 IO 操作(见注释),理想情况下是await'ed。只有当该方法被标记为async 时才有可能。这反过来又要求调用函数是async 才能再次await 等等。因此,在需要时标记async 和await 的所有内容......如何处理这种情况?
注意:请不要争论不做任何同步操作的必要性,因为这不是重点。
注意 2:这个问题不是关于 await 或 async 是什么,也不是关于它何时执行。这个问题是关于性能和语言内部的(尽管存在多种实现,但这个概念可能存在固有的语义开销)。
【问题讨论】:
-
异步函数将在最早的一个事件循环滴答之后执行。这个问题不是stackoverflow的好格式
-
我不明白我的问题有什么问题。你能详细说明@AndyRay
-
您可以根据需要异步处理每个函数。
await也适用于非承诺值。 “如何处理这种情况?” 没有新的方法来处理这种情况。async/await只是承诺的语法糖。在处理 Promise 时,您会做同样的事情。 -
"bar() 在其体内阻塞" - 这不起作用。即使
async functions 仍然是异步的——非阻塞的,这就是 node.js 中并发的全部意义。 -
“为什么他们不认为每个函数默认都是异步的?” - 因为不是每个函数都应该返回一个承诺。如果你的意思是它应该只是在引擎盖下“阻塞”,就像到处都有一个
await:that would be an absolutely horrible idea。
标签: javascript node.js asynchronous