Javascript 等待使用nodejs的API的结果
我是Node.js的新手。我想调用一个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
// 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;
}