6

小さいものから大きいものまで動的な値を持つ for ループがある場合、次の呼び出しを開始する前に、検索の 1 つの呼び出しを確実に終了させたいと考えています。それ、どうやったら出来るの?process.nextTick と setImmediate について読んだことがありますが、このコンテキストでどちらを使用するかはわかりません。

function search(x) {
      dns.resolve(x, function (err, addresses) {
           if (!err) {
                res.send("bad");
           } else {
                res.send("good");
           }
      });
}

for(a = 0; a < queries.length; a++) {
    query = queries[a];
    search(query);
}
4

3 に答える 3

3

私は通常、イベント エミッターを使用してすべてを同期させるだけなので、非同期環境の考え方の中で作業することができます。以下の私のコードでは、DNS 解決が完了するたびに、検索機能によってリッスンされるイベントが生成され、新しい検索を起動するように通知されます。さらに、独自の Event Emitters を作成する方法を学ぶことができます。これはすばらしいものです。

ドメイン名配列の特定のサイズに対して非同期にしたい場合は、分母変数を作成し、モジュラス演算子を使用して非同期をチャンクで送信し、モジュラスが0.

// program that uses event emitters to create sync code in an async env

var dns = require('dns')                                //dns from core
var eventEmitter = require('events').EventEmitter       //Event Emitter from core

var ee = new eventEmitter;      //make an Event Emitter object

var queries = ['yahoo.com','google.com','james.com'];

ee.on('next', next_search);     //create a listener for an event we define

// our listening function that executes on our defined 'next' event
function next_search() {
        search(queries[a]);
        if(queries.length == a) process.exit(0);
        ++a;
}

// the actual search function that uses DNS
function search(x) {
        dns.resolve(x, function (err) {
                if (!err) {
                        //res.send("bad");
                        console.log('bad: ' + x)
                        ee.emit('next')
                } else {
                        //res.send("good");
                        console.log('good: ' + x)
                        ee.emit('next')
                }
        });
}


// global variable to keep track of our name queue length
var a = 0;

// kick it all off
next_search()
于 2013-07-30T08:34:44.740 に答える
2

私は最近、(ノードファイバーに基づいて) 同期モードで非同期関数を呼び出すために、wait.forと呼ばれるより単純な抽象化を作成しました。次の場所にあります。

https://github.com/luciotato/waitfor

wait.forを使用すると、 dns.resolve を呼び出して順次実行できます。

wait.forを使用すると、ノードのイベント ループをブロックすることなく、同期関数であるかのように、標準の nodejs 非同期関数を呼び出すことができます。必要なときに順次コーディングできます。

コードは次のようになります。

for(a = 0; a < queries.length; a++) {
  try {
    addresses = wait.for(dns.resolve,queries[a]);
    res.send('good');
  }
  catch(err){
    res.send('bad');
  }

}//end for
于 2013-08-28T03:44:43.773 に答える