使用外部asynchronous

有没有办法让JavaScript的关键字工作以外的asyncfunction? 我希望能够冻结整个调用堆栈(而不仅仅是async函数的其余部分),一旦特定的承诺返回一个值就可以恢复。 可悲的是,像这样的强大的await目前正在实施或尚未实施。 我试图使nodent.js工作,但由于我的自定义加载器和dynamicfunction,这是不幸的。

鉴于你正在寻找一个黑客,而不是一个适当的基于承诺的并发解决scheme,看看节点光纤 (有类似的,但afaik这是最stream行的,周围有多个抽象)。 它允许你停止任何同步function中的当前光纤,直到asynchronous发生在不同的光纤中。 这当然是一个可怕的想法 ,但是…

有没有办法让JavaScript的关键字工作以外的asynchronousfunction?

可悲的是,答案是:不。

看文档:

awaitexpression式导致asynchronous函数执行暂停 ,等待Promise的parsing,并在parsing值时恢复asynchronous函数执行 。 [着重点]

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

我希望能够冻结整个调用堆栈(而不仅仅是asynchronous函数的其余部分),一旦特定的承诺返回一个值就可以恢复。

但是,如果整个调用堆栈被冻结,那么你的承诺如何能够返回一个值呢? 它将被永久卡住。

更多细节

使用await你需要在里面的async function

至less你必须这样做:

 async function main() { // use await here } main(); 

在你的主要代码中。

或者,使用IIFE – 感谢Robert Klep提出的build议:

 void async function main() { // use await here }(); 

或者,如果你喜欢标点符号:

 (async () => { // use await here })(); 

其他选项

还有一些其他选项可以处理Node中的并发,如:

但是,它们中的任何一个都不会冻结调用堆栈,因为它与使用自己的进程ID运行kill -STOP具有相同的效果,并等待停止的进程自行恢复。