2016-04-30 39 views
0

基本上我想這樣的事情(現在肯定不工作)。 完成所有client.get()後,我可以使用事件使res.send()發生嗎?如何調用多個事件後的功能全部觸發

var events = require('events'); 
var eventEmitter = new events.EventEmitter(); 

var response = {}; 
var ids = [...]; 

for (id in ids) { 
    this.client.get(id1, function(err, obj) { 
    if (!err) { 
     response[id.toString()] = obj; 
    } 
    }); 
} 

res.send({ 
    response 
}); 
+0

參見:http://stackoverflow.com/questions/8011652/jquery-when-with-variable-arguments –

回答

5

使用Promise.all的Promise.all(迭代器)方法返回解析當所有的迭代器參數的承諾已經解決了一個承諾,或率先通過承諾的理由拒絕拒絕。

var events = require('events'); 
 
var eventEmitter = new events.EventEmitter(); 
 

 
var response = {}; 
 
var ids = [...]; 
 
var promiseArr = []; 
 
for (id in ids) { 
 
    var prom = new Promise(function(resolve, reject) { 
 
    this.client.get(id1, function(err, obj) { 
 
     if (!err) { 
 
     response[id.toString()] = obj; 
 
     resolve(); 
 
     } 
 
    }); 
 
    }) 
 
    promiseArr.push(prom); 
 
} 
 
Promise.all(promiseArr).then(function() { 
 
    res.send({ 
 
    response: response 
 
    }); 
 
})

注:正如評論說timster,同時採用Promise object考慮瀏覽器的支持,Polyfill將幫助!

+0

THX,承諾看起來很酷 –

+0

@xgwang,_Glad幫助_ – Rayon

+0

良好的小費,但MSIE(最多! 11)不支持Promise對象。 –