Javascript: .then () в обещании не выполняется? - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу файл сценария только для доступа к JSON из URL. Я хочу иметь метод для возврата объекта JSON из сценария в переменную в отдельном файле сценария, а затем изменить его соответствующим образом. Очевидно, что, поскольку javascript является асинхронным, произойдет сбой, если я просто напишу его. Поэтому я должен использовать обещание:

var promise1 = new Promise(function(resolve, reject) {
  access(userSearchText); //send user input to get appropriate JSON object
});

promise1.then(function(value) {
  var getData = returnData();     //method that returns JSON object from the other script
  alert(getData);                 //print out the returned JSON object
  console.log("we have finished");
});

Но это ничего не распечатывает. Предупреждение не происходит вообще, и в консоли ничего не печатается. Я использую jquery для доступа к URL-адресу в другом скрипте, и у меня есть .done после доступа к нему в скрипте для получения JSON как: access.js

var sendData;

(function() {

        jqxhr = $.getJSON( url, {

        })
        .done(function( data ) {
            sendData = data;

    });
})();

function returnData(){
    return sendData;
}

Так что не должно быть никаких асинхронных проблем в скрипте для доступа к URL из-за .done. Я действительно не понимаю, почему это не работает. Я проверил свою страницу, и ошибок нигде не было видно. Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 05 ноября 2018

promise1 никогда не разрешается.

В вашем определении promise1 вы никогда не вызываете функцию resolve() для ее разрешения. Таким образом, .then() никогда не вызывается.

Обещания, созданные вручную, разрешаются только при явном вызове resolve() в функции исполнителя.

Если access() сам по себе является асинхронным, то нам потребуется больше информации об этой функции, чтобы помочь вам сделать это правильно. Завершение обещания не поможет вам. Если access() само по себе возвращает обещание, вы должны просто использовать это обещание, а не оборачивать его.


Вероятно, access() должен вернуть обещание, которое разрешается после выполнения асинхронной операции, а затем вы можете выполнить:

access().then(...).catch(...);

И не оборачивайте это другим обещанием.

Материал sendData и returnData() выглядит просто неправильно. Вам нужно будет объяснить и показать больше контекста, чтобы знать, что именно рекомендуется.

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