2015-10-17 115 views
0

我試圖創建一個數組從API調用的輸出設置同步的NodeJS調用。所有API調用都基於條件。我已經嘗試了下面的代碼。如何使基於條件

var a = true; 
var b = false; 
var c = true; 


var result = []; 

if(a) 
{ 
    callApi("a", function(data){ 

     result.push(data); //data = this is a 

    }) 
} 

if(b) 
{ 
    callApi("b", function(data){ 

     result.push(data); //data = this is b 

    }) 
} 

if(c) 
{ 
    callApi("c", function(data){ 

     result.push(data); //data = this is c 

    }) 
} 


console.log(result); 

輸出應該是

["this is a", "this is c"]; 

「B」 不應該來這裏,因爲條件是它錯誤的。

但它顯示空數組,因爲它沒有等待回調。

[] 

如何讓整個過程同步?

回答

1

我怎樣才能使整個過程同步?

你絕對不能也不應該忘掉它。你已經有了一個異步函數列表,並且一旦所有這些異步函數完成執行,你都應該使用這些異步函數的結果。這是異步函數的工作方式。

所以,一種可能性是promisify your callapi function使用q模塊:

function promisify(arg) { 
    var deferred = Q.defer(); 
    callApi(arg, function(data) { 
     deferred.resolve(data); 
    }); 
    return deferred; 
} 

現在你已經這樣做了,事情變得更加容易:

var a = true; 
var b = false; 
var c = true; 
var promises = []; 

if (a) { 
    promises.push(promisify('a')); 
} 

if (b) { 
    promises.push(promisify('b')); 
} 

if (c) { 
    promises.push(promisify('c')); 
} 

,現在你已經有了承諾陣列就像等待所有人結束並簡單地消費結果一樣簡單:

Q.allSettled(promises).then(function(results) { 
    // TODO: do something with the results here 
    console.log(results); 
}); 
+1

讓我們使用術語* promisify *,而不是* promessify * :-) – Bergi

+0

@Bergi,當然,我並不熟悉確切的術語。 –

+0

我想建議的代碼,但我無法看到使用的console.log(結果)結尾的數據;在Q.allSettled –

0

https://github.com/caolan/async

async.series([ 
    function(callback){ 
     // do some stuff ... 
     callback(null, 'one'); 
    }, 
    function(callback){ 
     // do some more stuff ... 
     callback(null, 'two'); 
    } 
], 
// optional callback 
function(err, results){ 
    // results is now equal to ['one', 'two'] 
}); 

也ü可以選擇做處理在每個功能並聯或串聯

ü可以把UR如果邏輯,如果真做回調(NULL,RES),並將其推送到結果數組,假如做回調(null,null)