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

Node.js イベント ループを JavaScript に公開する C++ で記述されたモジュールであるdeasyncを使用します。このモジュールは、後続のコードをブロックする関数も公開し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
})

注意: クエリには、標準のコールバック呼び出し (最初にエラーを指定) を使用する必要があります: callback(error, result)。クエリ メソッドを変更できない場合は、.async() ラッパーを作成するだけです (github リンクを参照)。

于 2013-05-16T13:40:18.467 に答える