使用外部asynchronous
有没有办法让JavaScript的关键字工作以外的async
function? 我希望能够冻结整个调用堆栈(而不仅仅是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中的并发,如:
- https://www.npmjs.com/package/co
- https://www.npmjs.com/package/bluebird-co
- https://www.npmjs.com/package/async-co
- http://bluebirdjs.com/docs/api/promise.coroutine.html
- http://taskjs.org/
但是,它们中的任何一个都不会冻结调用堆栈,因为它与使用自己的进程ID运行kill -STOP
具有相同的效果,并等待停止的进程自行恢复。