2016-04-30 3 views
0

Grundsätzlich möchte ich so etwas (funktioniert jetzt definitiv nicht). Kann ich Ereignisse verwenden, um die res.send() passieren zu lassen, nachdem alle client.get() fertig sind?So rufen Sie eine Funktion auf, nachdem mehrere Ereignisse ausgelöst wurden

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 –

Antwort

5

Verwenden Promise.all, Die Promise.all (abzählbaren) Methode gibt ein Versprechen, dass, wenn alle die Versprechungen im iterable Argumente löst haben beschlossen, oder lehnt sie ab mit der Begründung der ersten bestanden Versprechen das lehnt ab.

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 
 
    }); 
 
})

Hinweis: Wie timster kommentierte Browser-Unterstützung betrachten, während Promise object verwenden, Polyfill helfen! Siehe

+0

Thx, sehen Versprechen kühle –

+0

@xgwang, _Glad zu helfen _ – Rayon

+0

Guten Tipp, aber MSIE (bis zu! 11) unterstützt das Promise-Objekt nicht. –

Verwandte Themen