2016-08-08 6 views
2

私は、親レストサービスから子レストサービスに電話したいと思う。子サービスが呼び出される回数は、親レストサービスへのパラメータによって異なります。一度、すべての子サービスインスタンスを異なるパラメータで同時に呼び出します。子サービスのすべてのインスタンスからの応答を結合したいと思います。私は以下のスニペットを使用しています。しかし、私はタイムアウトを使いたくありません。タイムアウトになるか、子サービスのすべての呼び出しがそれまでより少なくなっているかのいずれかである必要があります。Node.js同じ子レストサービスへの並行呼び出しと集約応答

for(i=0; i<length; i++) 
    { 
     url=accountID[i] +'+'+sortcode[i] +'+' +accountHolderName[i]; 

     micro(url ,filter[i],function(resp) 
     { 
      this.resutlObject[count]=resp; 
      console.log("count"+count); 
      count=count+1; 
     }.bind({resutlObject: resutlObject})); 
    }//end of for 

    setTimeout(function() { 
     console.log("in time out"); 
     res.end(JSON.stringify(resutlObject || {}, null, 2)); 
    },500); 

答えて

0

async moduleを使用できます。それはあなたが後にしているものを行うように設計されています。このような何か:

var async = require('async'); 
var collection = []; 

for(i=0;i<length;i++) { 
    collection.push(
     (function(i) { 
      return function(callback) { 
       url=accountID[i] +'+'+sortcode[i] +'+' +accountHolderName[i]; 
       micro(url ,filter[i],function(resp) { 
        callback(null, resp); 
       }); 
      } 
     })(i) 
    ); 
}//end of for 

async.parallel(collection, function(err, results) { 
    console.log(results) // array of results from all requests 
}) 

async.parallel何が起こるかは、引数として関数の配列をとります。各関数は、引数としてcallbackを受け取ります。コールバックは関数で、errorresultを引数にとります。

すべてのコールバックが実行された後、asyncは、他のすべてのコールバックから結果の配列を受け取る最終コールバックを呼び出します。

ループでは、関数のコレクションを作成しています。この例では、これらの関数のそれぞれについてiの値を保持するためにクロージャを使用するため、コードは少し複雑です。

+0

投稿者: –

0

非同期モジュールasyncを使用できます。並列foreachループを提供します。

var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"}; 
var configs = {}; 

async.forEachOf(obj, function (value, key, callback) { 
    fs.readFile(__dirname + value, "utf8", function (err, data) { 
    if (err) return callback(err); 
    try { 
     configs[key] = JSON.parse(data); 
    } catch (e) { 
     return callback(e); 
    } 
    callback(); 
    }) 
}, function (err) { 
    if (err) console.error(err.message); 
    // configs is now a map of JSON data 
    doSomethingWith(configs); 
}) 

ここの例では、パラメータにリストされているファイルを読み取ります。 同様にあなたの仕事のために行うことができます

0

また、約束を使用することができます。 service呼び出しが約束を返すとしたら、allが満たされている間待ってください。 Node.jsは、v4から始まる約束をサポートしています。以前のバージョンのノードを使用している場合は、libraryを使用してください。

//Instead of 
function micro(url, filter, cb) { 
    var resp = "result of async job";//do some async work 
    cb(resp) 
} 

//Modify your service to return a promise 
function micro(url, filter) { 
    return new Promise(function(resolve, reject) { 
     var resp = "result of async job using `url` and `filter`"; 
     if (resp) { 
      resolve(resp); 
     } else { 
      reject("reason"); 
     } 
    }); 
} 

//Create a list of service calls. 
var promises = []; 
for(i=0; i<length; i++) 
{ 
    url=accountID[i] +'+'+sortcode[i] +'+' +accountHolderName[i]; 
    promises.push(micro(url, filter[i])); 
} 

//Wait for all off them to fulfill 
Promise.all(promises) 
    .then(function(resultObject) { 
     //Response 
     res.end(JSON.stringify(resultObject || {}, null, 2)); 
    }, function(reason) { 
     res.sendStatus(500); 
     console.error(reason); 
    }); 
+0

申し訳ありません、私の英語:) –

+0

心配してくれてありがとう –

関連する問題