在独立脚本中的javascript node.js,阻止/等待承诺

我在node.js中有一个简单的程序,比如:

// CODE1 step1(); step2(); var o = step3(); step4(o); step5(); step6(); 

这个程序是在一个独立的脚本(而不是在一个Web浏览器)中运行的,它是一个顺序程序,执行顺序是重要的(例如,step6需要在第5步之后执行)。

问题是,step3()是一个asynchronous函数,并且值“o”实际上被传递给给定的callback,所以我需要修改程序如下:

 // CODE2 step1(); step2(); step3( function (o) { step4(o); step5(); step6(); }) 

从callback函数调用step4是有意义的,因为它取决于step3计算出的“o”值。 但step5和step6函数不依赖于“o”,我必须将它们包含在该callback函数中,仅保留执行顺序:step3,step4,step5,step6。

这听起来对我来说真的很糟糕。 这是一个顺序程序,所以我想将step3转换为同步function。

这个怎么做? 我正在寻找这样的东西(例如使用Q):

 // CODE3 step1(); step2(); var deferred = Q.defer(); step3(deferred.resolve); deferred.blockUntilFulfilled() // this function does not exist; this is what i am looking for var o = deferred.inspect().value step4(o); step5(); step6(); 

这个怎么做?

ps:使用sync或async有优点和缺点,这是一个非常有趣的讨论。 然而,这不是这个问题的目的。 在这个问题上,我问我怎样才能阻止/等待一个承诺(或等价)得到满足。 请,请不要开始讨论是否同步/阻止是好的。

在vanilla JavaScript中将asynchronous操作变成同步操作是不可能的。 有些东西就像node-fibers(一个C ++插件)可以实现,或者是各种编译成JS的语言,使得asynchronous操作看上去是同步的(本质上是通过重写第一个代码块到第二个代码块),但是在asynchronous操作完成之前无法阻塞。

有一种方法可以看到,JavaScript事件循环总是“运行到完成”,这意味着如果你有一系列的语句,它们将总是保证一个接一个地执行,而两者之间没有任何内容。 因此,没有办法让外部信息进入,并告诉代码停止阻塞。 假设你试图让它像这样工作:

 stepA(); stepB(); while (global.operationIsStillGoing) { // do nothing } stepC(); 

这是行不通的,因为由于JavaScript的运行到完成的性质,在while循环期间不可能更新global.operationIsStillGoing ,因为这一系列语句还没有运行完成。

当然,如果有人写一个修改语言的C ++插件,他们可以解决这个问题。 但是,这不是真的JavaScript,至less在ECMAScript +事件循环体系结构的普遍理解的意义上。