28

我怎样才能使这项工作

var asyncToSync = syncFunc();

function syncFunc() {
    var sync = true;
    var data = null;
    query(params, function(result){
        data = result;
        sync = false;
    });
    while(sync) {}
    return data;
}

我试图从异步一中获取同步功能,我需要它使用 FreeTds 异步查询作为同步一

4

5 回答 5

25

使用deasync - 一个用 C++ 编写的模块,它将 Node.js 事件循环暴露给 JavaScript。该模块还公开了一个sleep阻塞后续代码但不会阻塞整个线程,也不会导致忙等待的函数。您可以将sleep函数放入while循环中:

var asyncToSync = syncFunc();

function syncFunc() {
    var sync = true;
    var data = null;
    query(params, function(result){
        data = result;
        sync = false;
    });
    while(sync) {require('deasync').sleep(100);}
    return data;
}
于 2014-03-16T19:53:39.277 回答
12

如今,这种生成器模式在许多情况下都可以成为出色的解决方案:

// 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? ', res=>main.next(res))    

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

  // 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
于 2016-08-17T20:46:08.203 回答
9

您可以使用node-sync lib

var sync = require('sync');

sync(function(){
  var result = query.sync(query, params);
  // result can be used immediately
})

注意:您的查询必须使用标准回调调用(首先有错误):回调(错误,结果)。如果您无法更改查询方法,只需创建 .async() 包装器(参见 github 链接)。

于 2013-05-16T13:40:18.467 回答
3

我一直在使用syncrhonize.js并取得了巨大的成功。甚至还有一个挂起的拉取请求(效果很好)来支持具有多个参数的异步函数。比 node-sync imho 更好也更容易使用。额外的好处是它具有易于理解和详尽的文档,而 node-sync 没有。

于 2014-01-19T19:18:32.980 回答
2

您遇到的问题是您的紧密 while 循环被阻塞。所以我认为您的查询回调永远不会运行。我认为您需要使用 setTimeout 等来防止函数阻塞,但如果您这样做,函数将在调用回调之前返回。此功能必须在较低级别实现。

如果您在浏览器中,您可以查看这篇文章。在节点中,您必须依赖于您查询的任何内容的实现。它可能提供也可能不提供同步方法。

于 2014-01-19T21:00:42.077 回答