2016-04-01 9 views
0

Ich benutze Lodash, um ein Array abzubilden. In der Schleife gibt es ein Versprechen, etwas von einer externen API zu bekommen.Versprechen in Lodash Karte

var array = _.map(data, function (d, i) { 
    getFromMyAPI(d[4]) 
    .then(function (results) { 
    return { 
     id: d[0], 
     zoneLat: d[2], 
     zoneLon: d[3], 
     wifiLat: results.a, 
     wifiLon: results.b 
    }; 
    }); 
}); 

Aber dann, wenn ich

console.log(array); 

tun zeigt es, natürlich, ein leeres Array. Wie kann ich den Inhalt dieses Arrays nach dem Mapping erhalten?

Antwort

4

Ich wette, Sie haben entgangen, dass getFromMyApi Aufruf Argument von Iteration erfordert ... nehmen wir an, das ist richtig.

Sie sollten dieses Array als Ergebnis von Promise behandeln, das irgendwie an alle Ergebnisse von getFromMyAPI Rufe angekettet ist. Irgendwie ist das am besten mit einer fortgeschrittenen Versprechens-Bibliothek getan, die funktionale Versionen von Klassifizierungskarten bereitstellt und Versprechen wie Bluebird reduziert.

Beispiel drossel mit:

var Promise = require('bluebird'); 
return Promise.map(data, function(d,i) { 
    return getFromMyApi(arguments, d).then(function(r) { 
     return { 
      id: d[0], 
      zoneLat: d[2], 
      zoneLon: d[3], 
      wifiLat: r.a, 
      wifiLon: r.b 
     }; 
    }) 
}).then(function(array) { 
    console.log("#2", array); 
}); 
+0

genial, es funktioniert perfekt! Vielen Dank – Mencls

1

Sie haben die Rückgabe der Kartenfunktion vergessen. Das Array sollte nicht leer sein, sondern die Promises enthalten.

1

ändern es so und es sollte funktionieren:

var array = []; 
 
_.map(data, function (d, i) { 
 
    getFromMyAPI(d[4]) 
 
    .then(function (results) { 
 
    array.push({ 
 
     id: d[0], 
 
     zoneLat: d[2], 
 
     zoneLon: d[3], 
 
     wifiLat: results.a, 
 
     wifiLon: results.b 
 
    }); 
 
    }); 
 
});

Herausgegeben

+0

leid, dass ich das Argument vergessen zu erwähnen mit der Karte Iterator verbunden ist, habe ich den Quellcode aktualisiert – Mencls

+0

In diesem Fall können Sie die Werte zurück zuweisen müssen. Ich habe den Code bearbeitet. –