Ich versuche, ein Array gefüllt mit den Informationen zurück von einigen Anfragen zu verschiedenen REST-APIs zu bekommen. Ich dachte über die Verwendung von Promise.all
zu tun, aber aus irgendeinem Grund, ergibt es ein Array mit einer Reihe von undefined
innerhalb.Wie man Promise.all richtig behandelt: Immer undefiniert
[undefined, undefined, undefined, undefined]
Hier ist mein Code:
var _ = require("lodash");//Used exclusively to check if the result from the request is an object
var ccxt = require("ccxt");//External library used to make the requests
let pairs = ["ETH/EUR", "BTC/EUR", "LTC/EUR", "BCH/EUR"]; //Array on which the Promise.all is based
function test(p) {
for (var i = 0; i < ccxt.exchanges.length; i++) { //Looping through all the rest APIs
let exchange = new ccxt[ccxt.exchanges[i]](); //Defining each API to make the requests
if (exchange.hasFetchOrderBook) {
exchange //Beginning of the request
.fetchOrderBook(p)
.then(order => {
if (_.isObject(order) && order.bids[0][1]) {
let now = Math.floor(new Date());
order.mkt = exchange.name;
order.pair = p;
order.ping = now - order.timestamp;
return order; //Return the result of the request
}
})
.catch(e => {});
}
}
}
Promise.all(pairs.map(test)) //Making the requests based on the Pairs Array
.then(res => {
console.log(res); //Logging the results ==> [undefined, undefined, undefined, undefined] for some reason...
})
.catch(e => {
console.log(e);
});
Ich weiß, dass die Anträge richtig gemacht werden, da, wenn ich die order
console.log innerhalb die Schleife, ich bekomme die richtigen Ergebnisse - Beispiel für das Ergebnis bei der Protokollierung:
{ bids:
[ [ 12009.52, 0.0468 ],
[ 12008.5, 0.0227 ],
[ 12007.48, 30.9321 ],
[ 12006.46, 0.0537 ],
[ 12005.45, 0.0157 ],
[ 12004.43, 7.1659 ],
[ 12003.41, 0.0164 ],
[ 12002.39, 23.4159 ],
[ 12001.38, 0.0284 ],
[ 12000.36, 0.0132 ],
[ 11999.34, 0.0194 ],
[ 11998.33, 0.0034 ],
[ 11997.31, 7.526 ],
[ 2445.72, 34.075 ],
[ 2445.17, 25.4842 ],
[ 2444.96, 0.1118 ],
[ 2444.75, 23.288 ],
[ 2444, 0.0247 ],
[ 2443.8, 0.192 ],
[ 765.51, 0.0828 ] ],
asks:
[ [ 12048.74, 2.523 ],
[ 12049.77, 0.0159 ],
[ 12050.79, 0.029 ],
[ 12051.82, 0.0061 ],
[ 12052.84, 0.0181 ],
[ 12053.87, 0.0164 ],
[ 12054.89, 0.0355 ],
[ 12055.92, 0.0042 ],
[ 13419.62, 0.0063 ],
[ 13420.64, 0.0174 ],
[ 13421.78, 0.0143 ],
[ 13422.92, 0.026 ],
[ 13424.06, 0.0055 ],
[ 13425.2, 14.4552 ],
[ 13426.23, 0.0065 ],
[ 13427.25, 0.0057 ],
[ 13428.39, 0.0147 ],
[ 13429.53, 4.0375 ],
[ 13430.56, 23.9541 ],
[ 13431.58, 0.0137 ] ],
timestamp: 1512845715447,
datetime: '2017-12-09T18:55:15.447Z',
mkt: 'LakeBTC',
pair: 'BTC/EUR',
ping: 0 }
Also denke ich, dass die Probleme, mit denen ich es zu tun habe, mit dem asynchronen Charakter der Funktion zu tun haben ... aber ich bin nicht sicher, wie ich es synchron machen kann. Noch einmal, um meine Frage zu klären: Das Ziel ist es, ein Array mit 4 verschiedenen Objekttypen (eine pro Paar -> Array) zu bekommen, so dass ich auf jedem operieren kann. Nur um es klarer, hier ist eine Darstellung, was ich versuche zu erreichen:
[
[
Object1,
Object2,
Object3,
etc...
],
[
Object1,
Object2,
Object3,
etc...
],
[
Object1,
Object2,
Object3,
etc...
],
[
Object1,
Object2,
Object3,
etc...
]
]
Warum Promise.all
ist das Array der Rückkehr auf der requests'results ohne zu warten?
Ich hoffe, das war klar genug! Wenn nicht, lass es mich wissen! : P
Vielen Dank im Voraus für Ihre Hilfe!
Ihre Funktion 'test' gibt nichts zurück undefiniert. – elclanrs
Hey @elclanrs! Gibt es die Bestellungen nicht zurück? -> 'Reihenfolge zurückgeben; // Gebe das Ergebnis der Anfrage zurück. – Ardzii
Das 'return' ist _inside_ eine andere Funktion, also kehrt es zu _that_Funktion zurück, nicht zu der äußeren. – elclanrs