如何在Node.js上阻止进程并等待结果?

时间:2015-08-19 16:55:08

标签: javascript node.js asynchronous synchronous async.js

我遇到Node.js(v0.12.7)的问题。我正在编写一个必须在某处停止的应用程序,并等待查询到数据库的结果,然后等待它正在做什么。

问题并不像使用异步(系列等等)那么简单。我有多个功能和模块互相呼叫。我尝试使用异步,但它没有解决我的问题。

具体来说,我有一个类似的计划:

db = require('db-utils');
exports.myFunction() {
    // some code ...
    while(condition) {
        for(i from 0 to x) {
            // code ...
            if(condition) {
                // code ...
                db.executeCall(callback); // async with callback
                // this where I want to stop waiting for result
                // continue doing something with the result, in my case it is jumping, 
                // so I have a result = undefined 
                // code ..
            }
            // code ...
         }
         // code ...
     }
     // code ...
    // calculating some properties of oResult from the db query result above
    return oResult;
}

理想的情况是,将文件的所有内容作为顺序代码执行,但除了db调用之外,所有其他内容应该正常工作(我假设,有些用于,如果,变量赋值,没有什么花哨的话)。而且,我不能把所有内容放在回调中,因为在if,for和while之外有一个代码......

我找到了wait.for,但它似乎对我没用(并且该项目似乎被放弃了,因为最后一次提交是2年前:/)

2 个答案:

答案 0 :(得分:2)

在发电机方式的基础上,现在这种简单的模式在很多情况下都是很棒的解决方案:

// nodejs script doing sequential prompts using async readline.question function

var main = (function* () {

  // just import and initialize 'readline' in nodejs
  var r = require('readline')
  var rl = r.createInterface({input: process.stdin, output: process.stdout })

  // magic here, the callback is the iterator.next
  var answerA = yield rl.question('do you want this? ', r=>main.next(r))    

  // and again, in a sync fashion
  var answerB = yield rl.question('are you sure? ', r=>main.next(r))        

  // readline boilerplate
  rl.close()

  console.log(answerA, answerB)

})()    // <-- executed: iterator created from generator
main.next()     // kick off the iterator, 
                // runs until the first 'yield', including rightmost code
                // and waits until another main.next() happens

答案 1 :(得分:1)

我知道被问到的是针对Node.js的范例。那个不应该阻止等待异步调用的进程,但有时你只需要这样做(想想&#34;为其他人重构为另一个平台编写的5000行代码,你必须将它移植到node& #34; --vs--&#34;阻止进程等待可怜的数据库调用等待10秒;#34;)。

那么对于那些愿意违背最佳实践以及如何为最终期限和资源限制而做的事情的人,也许只是为了它的乐趣,并准备好迎接数百万的愤怒nodejs-async-warriors,欢迎来到DEASYNC的世界。

  

deasync将异步函数转换为同步,通过在JavaScript层调用Node.js事件循环,使用阻塞机制实现。 deasync的核心是用C ++编写的。

如上所述,它会干扰低级别的Node.js以实现真正的进程阻塞。我希望这能帮助那些需要它的人。

我的搜索让我发现了其他&#34;解决方案&#34;试图解决在Node.js中编写同步调用的问题,但没有一个适用于我的情况。也许它会在其他情况下起作用,所以在跳到像 DEASYNC 这样的激进措施之前检查它们会很好:

  • 等待:github.com/luciotato/waitfor& amp; Wait.for-es6 :github.com/luciotato/waitfor-ES6 =&gt;
  

node.js和浏览器的顺序编程,回调地狱的结束。   简单,直接的抽象。   通过使用wait.for,您可以在顺序/同步模式下调用任何nodejs标准异步函数,等待结果数据,而不会阻塞节点的事件循环。

  • 纤维:github.com/laverdet/node-fibers
  • Streamline.js :github.com/Sage/streamlinejs
  • 简单 ES6生成器:chrisbuttery.com/articles/synchronous-asynchronous-javascript-with-es6-generators /
  • 着名的异步:github.com/caolan/async

我希望这将用于善而不是邪恶。