2014-12-22 44 views
1

我有以下方法:同步調用中的node.js

var get = function(query_para,callback) { 

    var queryParams = query_para; 
    var timestamp ; 
    var some_Data = {}; 
    var data; 

    request({url:"http://some-url.com/q?", qs:queryParams}, function(err, response, body) { 
     if(err) { console.log(err); return; } 
     console.log(body); 
     var data = JSON.parse(body); 

     some_Data.count = data.count; 

     console.log("Returned data: "+some_Data.count); 

     callback(null,some_Data); 
    }); 

}; 

我想兩次調用該方法,並結合他們的結果。我已經通過以下方式使用回調來實現它:

get({ start: '2014/09/13-10:00:00', end: '2014/09/13-11:00:00', format: 'json' }, function(err, result1){ 
    get({ start: '2014/09/13-11:00:00', end: '2014/09/13-12:00:00', format: 'json' }, function(err, result2){ 
     console.log("r1:: "+result1.count); 
     console.log("r2:: "+result2.count); 
    }); 
}); 

有沒有更好的方法使其同步?我讀了幾件事(承諾和同步客戶端),但我不明白。兩次調用該函數並結合其結果的最佳方式是什麼?

+0

不 - 你的解決方案看起來不錯。另外,你是否會混淆「同步」和「串行」的概念?你的代碼在* serial *中執行兩個動作,但它執行的IO仍然是* asynchronous *。請注意,您可以在* parallel *中執行請求以提高性能並仍然保持排序(假設您的請求不會改變目標資源)。 – maerics

回答

2

首先,它看起來不像你的代碼是同步的。我會建議離開它異步和使用承諾圖書館像問:首先,確保Q被安裝:

npm install q 

從你get函數,返回一個承諾:

var get = function(query_para) { 

    var queryParams = query_para; 
    var timestamp ; 
    var some_Data = {}; 
    var data; 
    //Use q 
    var Q = require("q"); 

    //define a deferred that will be resolved later 
    var deferred = Q.defer(); 

    request({url:"http://some-url.com/q?", qs:queryParams}, function(err, response, body) { 
     if(err) { console.log(err); return; } 
     console.log(body); 
     var data = JSON.parse(body); 

     some_Data.count = data.count; 

     console.log("Returned data: "+some_Data.count); 

     //resolve the deferred here 
     deferred.resolve(some_Data); 
    }); 

    //return the promise 
    return deferred.promise; 
}; 

從您的代碼調用獲取功能:

var q = require("q"); 
var promiseArr = []; 
//First promise to your get function 
promiseArr.push(get({ start: '2014/09/13-10:00:00', end: '2014/09/13-11:00:00', format: 'json'})); 
//Second promise 
promiseArr.push(get({ start: '2014/09/13-11:00:00', end: '2014/09/13-12:00:00', format: 'json' })); 

//Use q.all to call a callback when all promises in the array are resolved: 
q.all(promiseArr).then(function (results) { 
    //First item is the data resolved from the first promise in the array 
    console.log("r1:: "+results[0].count); 
    //Second item is data resolved from second promise 
    console.log("r2:: "+results[1].count); 
}); 
+0

它不適合我。作爲迴應,我收到無效請求。 –

+0

然後,您的調用請求函數可能有問題。我只是鏡像你的代碼,並明確地做了回調,解決了使用Q.創建的延遲。 – Patrick

+0

但我發佈的代碼工作正常。但上面的一個沒有。 –