从函数异步调用,调用API

时间:2019-01-04 13:20:29

标签: javascript node.js asynchronous

我还在学习异步。 我无法使我的异步代码正常工作。我有一个函数,即调用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 {}

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

此行为是设计使然。异步调用意味着您执行某些操作(例如发送AJAX请求)并且不等待它,当尚未收到结果时,程序将继续运行。您希望代码以同步方式运行,但事实并非如此。您可以使代码同步,但这不是一个好主意,因为这样您就在等待同步响应,并且页面可能被冻结,这是糟糕的UX。正确的方法是在回调中调用exchangeListe(传递给异步函数的函数是回调,即,它将在异步作业完成后执行),或者您可以重构您的代码并改用Promise,结果相同,但代码更优雅。