2017-12-11 7 views
-1

Node.jsは新しくなっています私はAPIを呼び出し、何かをする前に結果を待っています。この場合nodejsを使用してAPIからの結果を待つ

// endpoint 
function getListMarket() { 
    var deferred = Q.defer(); 
    deferred.resolve(Q().then(getMarkets) 
    .then(calculIndicators)); 
    return deferred.promise; 
} 

// Get a list 
function getMarkets() { 
    var deferred = Q.defer(); 
    bittrex.getmarketsummaries(function (data, err) { 
    if (err) deferred.reject(err.name + ': ' + err.message); 
    if (data) { 
     var listMarkets = []; 
     for (var i in data.result) { 
     listMarkets.push(data.result[i]); 
     } 

     deferred.resolve(listMarkets); 
    } 
    }); 

    return deferred.promise; 
} 

// Update a Coin 
function calculIndicators(coinList) { 
    var deferred = Q.defer(); 
    var promises = []; 
    coinList.forEach(function (coin) { 
    promises.push(getCandles(coin).then(getIndicators(coin))); 
    }); 

    Q.allSettled(promises).then(function (results) { 
    console.log('3 ---------------------------------------------'); 
    var listMarkets = []; 
    results.forEach(function (r) { 
     console.log("result ok" + r.value.name); 
    }); 

    deferred.resolve(listMarkets); 
    }); 

    return deferred.promise; 
} 

// Get a information needed to update the coin 
function getCandles(coin) { 
    var deferred = Q.defer(); 
    bittrex.getcandles({ 
    marketName: coin.MarketName, 
    tickInterval: 'hour', // intervals are keywords (oneMin, fiveMin, hour, thirtyMin, Day) 
    }, function (data, err) { 
     if (err) { 
      deferred.reject(err.name + ': ' + err.message); 
     } 

     if (data) { 
      console.log('1 : data'); 
      coin.Test= 10; 
      deferred.resolve(coin); 
     } 
     }); 

    return deferred.promise; 
} 

// Update the coin with the information from getCandles 
function getIndicators(coin) { 
    console.log('2 : ' + coin.Test); 
} 

私は私の関数getListMarketを呼び出すときに、出力は次のようになります。

2 : undefined 
2 : undefined 
2 : undefined 
... 
1 : data 
1 : data 
1 : data 
... 
3 --------------------------------------------- 

あなたは私を説明することができ、なぜログは、「2」は、この場合には1の前に呼ばれているのですか? 私はgetCandlesのAPIは非同期呼び出しだと思いますが、私はその理由を知りません。 getIndicators関数でこのapiの結果が必要です。

+0

あなたがgetIndicatorsを呼び出しています早すぎる。 –

答えて

0

それはあなたがここでやろうとしている明確なすべてではないのですが、あなたはより良いものの全体の束を実行する必要があります。

  1. (別の手動で作成された約束で約束を包む)繰延アンチパターンを避けてください。
  2. .then()ハンドラ内で常に解決された値が返されていることを確認してください。
  3. .then()に渡すときに関数を呼び出すのが早すぎるのは避けてください。 .then(fn)で、.then(fn())ではありません。
  4. listMarketsの値を設定する一部の不足しているコードを入力します。ここで

は、固定されたものの束(それはあなたには、いくつかの場所で何をしようとしてはっきりしていないようなコードはまだいくつかの分野でunfinisedているようだ)とのコードです:

// endpoint 
function getListMarket() { 
    return getMarkets().then(calculIndicators); 
} 

// Get a list 
function getMarkets() { 
    var deferred = Q.defer(); 
    bittrex.getmarketsummaries(function (data, err) { 
    if (err) { 
     deferred.reject(err.name + ': ' + err.message); 
    } else { 
     var listMarkets = []; 
     for (var i in data.result) { 
     listMarkets.push(data.result[i]); 
     } 
     deferred.resolve(listMarkets); 
    } 
    }); 
    return deferred.promise; 
} 

// Update a Coin 
function calculIndicators(coinList) { 
    var promises = []; 
    coinList.forEach(function (coin) { 
    promises.push(getCandles(coin).then(getIndicators)); 
    }); 

    return Q.allSettled(promises).then(function (results) { 
    console.log('3 ---------------------------------------------'); 
    var listMarkets = []; 
    results.forEach(function (r) { 
     console.log("result ok" + r.value.name); 
    }); 

    // Fixme: you need ro fill in listMarkets here 
    return listMarkets; 
    }); 
} 

// Get a information needed to update the coin 
function getCandles(coin) { 
    var deferred = Q.defer(); 
    bittrex.getcandles({ 
    marketName: coin.MarketName, 
    tickInterval: 'hour', // intervals are keywords (oneMin, fiveMin, hour, thirtyMin, Day) 
    }, function (data, err) { 
     if (err) { 
      deferred.reject(err.name + ': ' + err.message); 
     } else { 
      console.log('1 : data'); 
      coin.Test= 10; 
      deferred.resolve(coin); 
     } 
     }); 

    return deferred.promise; 
} 

// Update the coin with the information from getCandles 
function getIndicators(coin) { 
    console.log('2 : ' + coin.Test); 
    return coin; 
} 
関連する問題