【问题标题】:Async call from function, calling API来自函数的异步调用,调用 API
【发布时间】:2019-01-04 13:20:28
【问题描述】:

我还在学习异步。 我无法让我的异步代码工作。我有一个调用 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 + 使用 await,但没有任何帮助,我得到 Promise {}

感谢您的帮助

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2019-07-09
      • 1970-01-01
      • 2018-10-25
      相关资源
      最近更新 更多