使用等待异步外部

时间:2017-03-09 17:38:55

标签: javascript node.js asynchronous ecmascript-6 async-await

有没有办法让javascript await关键字在async函数之外工作?我希望能够冻结整个调用堆栈(而不仅仅是async函数的其余部分),一旦特定的promise返回一个值就恢复。可悲的是,像await这样强大的class A { private: unsigned int x; public: A() : x(15) { } unsigned int& GetX() { return x; } }; int main( void ) { A a; unsigned int y = 12; unsigned int& yr = y; unsigned int& xr = a.GetX(); // Is there anyway of identifying, using typeid() or something // similar, whether xr refers to x inside class A or is its type // completely indistinguishable from that of yr? i.e. does its type // information contain anything along the lines of // typeid(xr).name() == "A::unsigned int&" that identifies it as // belonging to class A? return 0; } 目前已被扼杀或尚未实施。我试图让nodent.js工作,但由于我的自定义加载器和动态函数,不幸的是它是不切实际的。

2 个答案:

答案 0 :(得分:5)

  

有没有办法让javascript await关键字在异步函数之外工作?

可悲的是,答案是:否。

参见文档:

  

await表达式导致异步函数执行暂停,等待Promise的解析,并在值解析时恢复异步函数执行 。 [强调补充]

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

  

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

但是如果整个调用堆栈被冻结,你的承诺怎么能返回一个值呢?它将永远陷入困境。

更多详情

要使用await,您需要在async function内。

至少你必须这样做:

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

在您的主要代码中。

或者,使用IIFE - 感谢Robert Klep提出的建议:

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

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

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

其他选项

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

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

答案 1 :(得分:3)

鉴于你正在寻找一个黑客,而不是一个适当的基于承诺的并发解决方案,看看node-fibers(有类似的,但afaik这是最流行的,围绕它建立了多个抽象) 。它允许您在任何同步功能中暂停当前光纤,直到异步发生在不同光纤中运行。当然这是is a horrible idea,但是......