Javascript 等待使用nodejs的API的结果

Javascript 等待使用nodejs的API的结果,javascript,node.js,q,Javascript,Node.js,Q,我是Node.js的新手。我想调用一个API并等待结果,然后再做一些事情 // endpoint function getListMarket() { var deferred = Q.defer(); deferred.resolve(Q().then(getMarkets) .then(calculIndicators)); return deferred.promise; } // Get a list function getMarkets() { var defe

我是Node.js的新手。我想调用一个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 ---------------------------------------------
你能解释一下为什么在这种情况下在1之前调用日志“2”吗? 我认为GetCandicts中的api是一个异步调用,但我不知道为什么。
我需要在函数getIndicators中获得此api的结果。

这里不清楚您要做的所有事情,但您需要做得更好:

  • 避免延迟反模式(将承诺包装到另一个手动创建的承诺中)
  • 确保始终从
    .then()
    处理程序中返回已解析的值
  • 传递到
    .then()
    时,避免过早调用函数。它应该是
    。然后(fn)
    ,而不是
    。然后(fn())
  • 填写一些缺失的代码,设置
    listMarkets
    的值
  • 下面是一系列已修复的代码(由于不清楚您在某些地方尝试执行的操作,代码在某些方面似乎还未被定义):


    你打电话太早了。
    // 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;
    }