2017-12-09 5 views
1

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!

+2

Ihre Funktion 'test' gibt nichts zurück undefiniert. – elclanrs

+0

Hey @elclanrs! Gibt es die Bestellungen nicht zurück? -> 'Reihenfolge zurückgeben; // Gebe das Ergebnis der Anfrage zurück. – Ardzii

+1

Das 'return' ist _inside_ eine andere Funktion, also kehrt es zu _that_Funktion zurück, nicht zu der äußeren. – elclanrs

Antwort

2

Ihre test Funktion gibt eine undefined zurück. Sie benötigen ein Versprechen für das Ergebnis zurück:

function test(p) { 
    return Promise.all(ccxt.exchanges.map(api => { //Looping through all the rest APIs 
//^^^^^^^^^^^^^^^^^^ 
    let exchange = new ccxt[api](); //Defining each API to make the requests 
    if (exchange.hasFetchOrderBook) { 
     return 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 
      } 
      // else undefined 
     }) 
     .catch(e => {}); // undefined 
    } 
    // else undefined 
    })); 
} 

Natürlich noch Ihr Versprechen mit undefined erfüllen, wenn die if Bedingungen nicht gelten oder ein Fehler passiert.

Verwandte Themen