有没有办法让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工作,但由于我的自定义加载器和动态函数,不幸的是它是不切实际的。
答案 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中还有其他一些处理并发的选项,例如:
kill -STOP
并等待已停止的进程自行恢复具有相同的效果。
答案 1 :(得分:3)
鉴于你正在寻找一个黑客,而不是一个适当的基于承诺的并发解决方案,看看node-fibers(有类似的,但afaik这是最流行的,围绕它建立了多个抽象) 。它允许您在任何同步功能中暂停当前光纤,直到异步发生在不同光纤中运行。当然这是is a horrible idea,但是......