Javascript не дожидаясь разрешения Promise в функции - PullRequest
0 голосов
/ 21 июня 2020

Мой js код должен дождаться завершения загрузки данных ajax.

if (district_search_value[0] == true) {
        var zone_search_value = checkZone(district_search_value[1], datas[i]['recipient_zone']);
        console.log(zone_search_value);
    }

Функция checkZone:

   function checkZone(district_id, zone_name) {
    var value = [];
    value[0] = false;
    value[1] = 0;
    find_zones_from_district_id().then(function(data) {
        // Run this when your request was successful
        console.log(data);
        var zones = JSON.parse(data);
            //console.log(zones);
            for (zones_row = 0; zones_row < zones.length; zones_row++) {
                if (zone_name == zones[zones_row]['zone_name']) {
                    value[0] = true;
                    value[1] = zones[zones_row]['id'];
                }
            }
        return value;
    }).catch(function(err) {
        // Run this when promise was rejected via reject()
        console.log(err);
    })
}

Основная функция обещания:

function find_zones_from_district_id(district_id) {
    return new Promise(function (resolve, reject) {
        $.ajax({
            type: 'POST',
            url: 'ajaxData_for_user.php',
            data: {import_excel_find_zones_from_district_id: 'district_id'},
            success: function (data) {
                resolve(data) // Resolve promise and go to then()
            },
            error: function (err) {
                reject(err) // Reject the promise and go to catch()
            }
        });
    });

}

Какова причина того, что javascript не дожидается разрешения обещания? Я также пробовал $ .when в jquery, но он также не ждет, пока ajax загрузит данные.

1 Ответ

0 голосов
/ 21 июня 2020

Две вещи нуждаются в исправлении, третья вещь необязательна

  1. Дождитесь разрешения обещания, прежде чем регистрировать результаты, используя .then()

    if (district_search_value[0] == true) {
      checkZone(district_search_value[1], datas[I]['recipient_zone'])
      .then(zone_search_value => {
        console.log(zone_search_value);
      }
    }
    
  2. checkZone должен вернуть обещание, которое оно получает от find_zones_from_district_id

    function checkZone(district_id, zone_name) {
      var value = [];
      value[0] = false;
      value[1] = 0;
      return find_zones_from_district_id().then(function(data) {
        // ...
    
  3. Как отмечает комментатор, нет необходимости заключать ajax звоните ...

    function find_zones_from_district_id(district_id) {
      return $.ajax({
        type: 'POST',
        url: 'ajaxData_for_user.php',
        data: {import_excel_find_zones_from_district_id: 'district_id'} // did you want to pass a string here or district_id parameter?
      })
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...