2016-08-01 10 views
3

Ich bin eine API, die alle Details zu Kills in einem Spiel zurückgibt, der erste Endpunkt gibt eine ID an die Kill-Ereignis zurück, dann ist ein zweiter Endpunkt Hit, um den Mörder zu holen und Namen zu töten.Wie kann ich zurückkehren, sobald alle Kind http Anfragen in einem Eltern http Anfrage

Aufgrund der Art, diese API eingerichtet ist Ich brauche einen Antrag zu stellen, um zuerst den Ereignis-ID und dann warten, bis alle IDs in dem zurückgegebenen Array ein Ergebnis zu erhalten und zu verarbeiten, dann den gesamten Kill-Array:

requestify.get(url).then(function (response) { 
     var events = []; 
     if (response.body && response.body.length > 0) { 
      data = JSON.parse(response.body); 
      if (data.hasOwnProperty('events')) { 
       events = data.events.map(function(event) { 
        return this.getDataForHeroKillId(event.id, function(killInfo) { 
         return { killer: killInfo.killer, killed: killInfo.killed, timestamp: event.time }; 
        }); 
       }.bind(this)); 
       console.log('events is: ', events); 
      } 
     } 
     return Promise.all(events); 
    }.bind(this)); 

Meine getKillInformation Funktion sieht wie folgt aus:

KillFeed.prototype.getKillInformation = function(id, cb) { 
var data = null; 
    requestify.get(url).then(function (response) { 
     var event = {}; 
     if (response.body && response.body.length > 0) { 
      data = JSON.parse(response.body); 
      if (data.hasOwnProperty('Killer')) { 
       event = { killer: data.Killer, killed: data.Killed}; 
      } 
     } 
     cb(event); 
    }); 
}; 

In der zweiten Methode, die ich hatte gehofft, dass ich das Ergebnis jedes Kind Anfrage Rückruf könnte und dann, wenn sie alle meine neuen Array ausgeführt wurde, um die Daten halten würde . Aber aufgrund der ereignisgesteuerten Natur von JS habe ich festgestellt, dass mein Codeblock weiterhin ein leeres Ereignisarray zurückgibt, da dieser Code offensichtlich nicht blockierend ist (verständlicherweise als Blockieren der Ereigniswarteschlange, während eine HTTP-Anfrage nicht ideal ist). Wie kann ich das umsetzen?

Antwort

1

Verwendet man promises für diese.

+0

Danke für die Antwort, aber in meiner 'events.map' Schleife löst es in [undefined, undefined, undefined]; weil es das Element zurückgibt, bevor die HTTP-Anfrage aufgelöst wird, was bedeutet, dass "return Promise.all" das Array '[undefined, undefined, undefined] 'zurückgibt, was ich noch tun kann? – Alex

+0

@Alex Ereignisse enthält es undefined, anstelle von einem Versprechen, weil Ihre Bedingungen nicht erfüllen - 'getKillInformation' response.body Länge ist 0, oder es hat keine Eigenschaft * Killer *. Es wird kein Wert zurückgegeben oder standardmäßig wird undefined zurückgegeben. – Kaspars

+0

Ich denke eigentlich, dass ich '.getKillInformation' ein Versprechen machen muss, damit Promise.all weiß, wann es zu lösen oder abzulehnen ist, ist das richtig? Mit der aktuellen Einstellung, wenn der Callback von "getKillInformation" aufgerufen wird, wird die Info wie erwartet in der '.map' -Funktion gedruckt, aber ich sehe, dass das Ereignisarray zurückgegeben wird, bevor das Map-Ereignis – Alex

0

Sie könnten async und seine Wasserfallmethode verwenden. Async ist ein NodeJS-Modul, kann aber auch im Browser verwendet werden.