我还在学习异步。
我无法使我的异步代码正常工作。我有一个函数,即调用API。
我在另一个函数上调用此函数,以便以后可以处理数据并合并它们。
但是我的代码总是前进,而无需等待第一个函数的答案。
异步/承诺问题
var exchangeListing = {
"exchange":
[
{
"name": "Kraken",
"pair": ['XBTUSD','XETHUSD']
},{
"name": "Coinbase",
"pair": ["BTC-USD","ETH-USDC"]
},{
"name":"Bittrex",
"pair": ["BTC-USD","BTC-ETH"]
}
]
}
function BXgetPrice(currencies) {
var ret;
bittrex.getmarketsummary( { market : currencies}, function( data, err ) {
if(data!=null) {
ret = {
message: {
type: 'success',
data: {
last:data.result[0].Last,
volume:data.result[0].Volume,
date:data.result[0].TimeStamp,
}
}
};
return ret;
} else {
return;
}
});
return ret;
}
//Loop to get all data from all exchanges we need, and merge in a JSON, to send to HTML page
function exchangeListe(exchangeListing) {
var exchangeListing = JSON.stringify(exchangeListing);
var exchangeListing = JSON.parse(exchangeListing);
console.log(exchangeListing);
for(var i = 0, len = exchangeListing.exchange.length; i < len; i++) {
var a = exchangeListing.exchange[i].name;
for(var j=0, l=exchangeListing.exchange[i].pair.length; j<l; j++) {
if(a=="Kraken") {
//add code to manipulate data
} else if(a=="Bittrex") {
console.log("bittrex");
BXgetPrice(exchangeListing.exchange[i].pair[j], function(data,err){
console.log("hi"+data);
//add code to manipulate data
}) ;
} else if(a=="Coinbase") {
//add code to manipulate data
}
}
}
}
在Exchange列表中,我需要我的循环来进行所有可用的交换和所有配对,从API调用获取数据,然后将它们合并。 现在,当启动exchangeListe(exchangeListing)时,我没有从函数BXgetPrice获取数据。数据为空。 我尝试在两者上都添加异步函数,并声明为const + use await,但没有任何帮助,在这种情况下,我得到了Promise {}
感谢您的帮助
答案 0 :(得分:0)
此行为是设计使然。异步调用意味着您执行某些操作(例如发送AJAX请求)并且不等待它,当尚未收到结果时,程序将继续运行。您希望代码以同步方式运行,但事实并非如此。您可以使代码同步,但这不是一个好主意,因为这样您就在等待同步响应,并且页面可能被冻结,这是糟糕的UX。正确的方法是在回调中调用exchangeListe
(传递给异步函数的函数是回调,即,它将在异步作业完成后执行),或者您可以重构您的代码并改用Promise,结果相同,但代码更优雅。