2016-01-13 14 views
1

我到目前爲止編寫的代碼如下所示。 我不需要整個迴應,但只是其中的一部分。能夠同時做到以上需要使用節點js異步調用兩個apis,並彙總來自apis的響應

var request = require('request'); 
var async = require('async'); 

var asyncTasks = []; 
var install; 

async.series([ 

    function (callback) { 
     setTimeout(function() { 
     request('URL', function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
      console.log(body); // Show the HTML for the Google homepage. 
      } 
     }); 
     }, 5000); 
    }, 

    function (callback) { 
     setTimeout(function() { 
     request('URL', function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
      console.log(body); // Show the HTML for the Google homepage. 
      } 
     }); 
     }, 5000); 
    } 

    ], 
    function (error, results) { 
    console.log(results); 
    }); 
+0

能不能請你格式化你的代碼,所以它是清晰? – Skam

+0

謝謝你承認我的回答。我已經重新格式化了您的問題中的代碼。 – arcseldon

回答

1

一種方法是使用async.parallel - 的形式:

async.parallel([ 
    function(){ ... }, 
    function(){ ... } 
], callback); 

另一種方法是使用一個承諾庫 - BlueBirdQ都是不錯的選擇。

Q.All是以下形式:

return Q.all([ 
    promise1, 
    promise2 
]).spread(function (resultFromPromise1, resultFromPromise2) { 
    // do something with the results... 

});

您可以使用這些方法之一來平行兩個調用。每個的輸出將給你一個數組,分別包含每個調用的結果

下面是每個方法的一個簡單的例子:

使用Async.js

var async = require('async'); 

var task = function (cb, count) { 
    setTimeout(function() { 
    cb(null, "complete: " + count); 
    }, 1000); 
}; 

async.parallel([ 
    function (cb) { 
    task(cb, 'one'); 
    }, 
    function (cb) { 
    task(cb, 'two'); 
    } 
], function (err, results) { 
    console.log(results); 
    //[ 'complete: one', 'complete: two' ] 
}); 

使用Q

var Q = require('q'); 

function task1(cb, count) { 
    var deferred = Q.defer(); 
    setTimeout(function() { 
    return deferred.resolve(cb(null, count)); 
    }, 1000); 
    return deferred.promise; 
} 

var myCb = function (err, count) { 
    return "complete: " + count; 
}; 

Q.all([task1(myCb, 'one'), task1(myCb, 'two')]) 
    .then(function (results) { 
    console.log(results); 
    //[ 'complete: one', 'complete: two' ] 
    }); 

讓我知道,如果你還不清楚。

+0

這個答案爲您提供了足夠的信息,還是您需要一個具體的例子? – arcseldon

+0

我如何簡化響應,然後我想將resoponse表單一個api聚合到其他api。 –

+0

你混淆了我..你的問題指出要聚集來自這兩個API響應..你現在說你需要調用API的順序,因爲第二個API請求取決於第一個API調用的輸出?或者你想知道如何彙總這兩個調用的結果? – arcseldon

0

承諾是在那裏幫助你在這種情況下。 我寧願使用'Q'庫。

我已經修改了你的代碼使用問答庫

var Q = require('q'); 
var request = require('request'); 


function makeCall() { 

Q.all([req1(), req2()]) 
    .spread(function (res1, res2) { 
     // This block is executed once all the functions(Provided in Q.all()) are finished its execution. 
     // Use responses from called functions 
    }, function (err) { 
     // Error, If any 
    }); 

} 

function req1() { 

var defer = Q.defer(); 
var url = ''; // Specify URL 
var options = { 
    method: 'get', // Method to use 
    url: url 
} 

request(options, function (err, res, body) { 
    if (err) { 
     return defer.reject(err); 
    } 
    return defer.resolve(body); 
}); 

return defer.promise; 
} 

function req2() { 

var defer = Q.defer(); 
var url = ''; // Specify URL 
var options = { 
    method: 'get', // Method to use 
    url: url 
} 
request(options, function (err, res, body) { 
    if (err) { 
     return defer.reject(err); 
    } 
    return defer.resolve(body); 
}); 
return defer.promise; 
} 

你可以找到對於Q庫這裏文檔:Q docs

+0

因此,可以說傑森結果我得到的是 {「ID」:1, 「名稱」:HHH 「ADDRES」:QQQ } ,我有元素的數組中此format.From我的代碼可以查詢我使用id,就像id = 1時,我需要姓名和地址。? –

+0

你能否詳細說明你的評論,因此很容易找出你正在尋找什麼。 –

+0

我想在下面的例子中使用傑森查詢到上面的代碼。 var jsonQuery = require('json-query') var data = { people:{name:'Matt',country:'NZ'}, {name:'Pete',country:'AU'} ] } jsonQuery( '人[國家= NZ]。名稱',{ 數據:數據 }) //很抱歉的代碼 的壞格式我試圖找出如何我可以將此添加到上面的代碼中。 –