Асинхронный вызов из функции, вызывающий API - PullRequest
0 голосов
/ 04 января 2019

Я все еще учусь об асинхронности. Я не могу заставить мой асинхронный код работать. У меня есть функция, которая вызывает 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 голосов
/ 04 января 2019

Это поведение является намеренным. Асинхронный вызов означает, что вы что-то делаете (например, отправляете запрос AJAX) и не ждете этого, ваша программа продолжает работать, когда результат еще не получен. Вы ожидаете, что ваш код будет выполняться синхронно, но это не так. Вы можете сделать свой код синхронным, но это будет плохой идеей, потому что тогда вы ждете синхронных ответов, и ваша страница может быть заморожена, что является плохим UX. Правильный способ сделать это - либо вызвать exchangeListe в вашем обратном вызове (функция, которая передается асинхронной функции, является обратным вызовом, то есть она будет выполнена, когда выполнено асинхронное задание), либо вы можете выполнить рефакторинг своего вместо этого используйте код и используйте обещания с эквивалентными результатами, но с более элегантным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...