2016-04-30 66 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对象。 –