Как получить доступ к глобальной переменной в JavaScript только после завершения блока асинхронного кода - PullRequest
0 голосов
/ 23 сентября 2019

Я запускаю этот блок асинхронного кода на первой странице, которая загружается на мой сайт (страница индекса), и задаю результирующие данные в глобальной переменной для использования на других страницах сайта.Проблема в том, что на других страницах сайта, когда я пытаюсь получить доступ к данным, возвращенным и сохраненным в глобальной переменной, я ничего не могу сделать с данными, пока они не будут полностью загружены, поэтому я получаю ошибки, которые говорят, что данные 'не определено.Мне нужен способ убедиться, что асинхронный код завершен, а данные доступны, чтобы их можно было использовать без ошибок.

var apiInitData = new Object();

// This block is asynchronous and sets the data in apiInitData
bn.push(["init", function() {
    bn.apiId.init({
    loginSuccess: function (event){
        var params = {cross_app: true};
        bn.api.callApi("/access/list", params, function(data) {
        apiInitData.data = data.data;
        });
    }
    });
}]);

На других страницах, которые загружаются после страницы индекса, я пытаюсь получить доступ к этой глобальной переменной:

console.log("apiInitData: ", apiInitData);

Это возвращает данные в apiInitData.Я могу просмотреть объект в моей консоли.

Однако, если я попытаюсь напечатать длину этих данных в следующей строке:

console.log("length", apiInitData.data.length);

Я получу ошибку:

UncaughtTypeError: Невозможно прочитать свойство 'length' с неопределенным значением

Я знаю, это связано с тем, что переменная apiInitData ожидает завершения асинхронного кода, но я не знаю, что можно сделать, чтобы дождаться его.Я читал о функциях обратного вызова, но чем больше я читаю, тем больше я запутался и просто не вижу, что здесь нужно сделать.

Как я могу использовать данные в apiInitData на других страницах сайтатолько после полной выборки блока асинхронного кода?

1 Ответ

0 голосов
/ 23 сентября 2019

Проблема здесь в том, что строка console.log("length", apiInitData.data.length); выполняется перед строкой apiInitData.data = data.data;

Итак, я предлагаю вам поместить строку console.log("length", apiInitData.data.length); внутри функции "doWhwhatWithApiInitData", а затем просто вызвать еепосле завершения вызова API, что-то вроде этого:

var apiInitData = new Object();

// This block is asynchronous and sets the data in apiInitData
bn.push(["init", function() {
    bn.apiId.init({
    loginSuccess: function (event){
        var params = {cross_app: true};
        bn.api.callApi("/access/list", params, function(data) {
        apiInitData.data = data.data;
        doWhateverWithApiInitData();  // Calling the function here should solve your issue
        });
    }
    });
}]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...