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

标签 javascript node.js q

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

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

该程序旨在在独立脚本中运行(而不是在网络浏览器中), 而且它是一个顺序程序,执行顺序很重要(例如,step6 需要在step5 之后执行)。

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

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

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

这对我来说听起来真的很糟糕。 这是一个顺序程序,因此我想将步骤3转换为同步函数。

如何做到这一点? 我正在寻找这样的东西(例如使用 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:使用同步或异步各有优缺点,这是一个非常有趣的讨论。然而,这不是这个问题的目的。在这个问题中,我问如何阻止/等待,直到 promise (或同等内容)得到履行。拜托,拜托,拜托,不要开始讨论同步/阻止是否好。

最佳答案

在普通 JavaScript 中不可能将异步操作转换为同步操作。有像 Node 纤维(C++ 附加组件)这样的东西可以实现这一点,或者各种编译为 JS 的语言可以使异步操作看起来同步(本质上是通过将第一个代码块重写为第二个代码块),但它在异步操作完成之前不可能阻塞。

了解这一点的一种方法是注意 JavaScript 事件循环始终“运行至完成”,这意味着如果您有一系列语句,它们将始终保证一个接一个地执行,中间没有任何内容。因此,外部信息无法进入并告诉代码停止阻塞。假设你试图让它像这样工作:

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

这永远不会起作用,因为由于 JavaScript 的运行到完成性质,任何内容都不可能在 while 循环期间更新 global.operationIsStillGoing ,因为这一系列语句尚未运行完成。

当然,如果有人编写了一个修改语言的 C++ 插件,他们就可以解决这个问题。但这不再是真正的 JavaScript,至少在 ECMAScript + 事件循环架构的普遍理解意义上是这样。

关于独立脚本中的 javascript node.js,阻止/等待 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17689151/

相关文章:

javascript - 在 Node.js 中使用循环和文件读取进行 Promise

javascript - 通过额外数据扩展 promise

JavaScript:适合在图像上创建自定义 "hotspots"的库

javascript - 如何在 AngularJS 中将受限范围传递给小部件

json - 如何使用 REST/JSON/GET/POST 从我的 Node 服务器访问我的 couchdb?

node.js - 无法从 Node 服务器连接到 postgres 数据库

node.js - 使用 Firebase 返回数组

javascript - 测试元素是否已经有 jQuery datepicker

javascript - 从对象中动态删除多个键/值对

javascript - Node 开发不连续运行