【问题标题】:Javascript not waiting for Promise to be resolved in a functionJavascript 不等待 Promise 在函数中解析
【发布时间】:2020-06-21 11:31:05
【问题描述】:

我的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);
    })
}

主要的promise函数:

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 不等待 promise 解决的原因是什么? 我也尝试过 jquery 中的 $.when ,但这也不会等待 ajax 加载数据。

【问题讨论】:

  • 也许使用等待者?
  • 旁注$.ajax()返回一个thenable,它不需要包裹在Promise
  • @STALER - 我试过 async await ,但我得到的是 Promise {} 而不是一个值
  • @JaredSmith - 谢谢你,很有见地。

标签: javascript ajax promise


【解决方案1】:

两件事需要修复,第三件事是可选的

  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?
      })
    }
    

【讨论】:

  • 感谢您的回答。我已经应用了所有三个更改。现在我在 checkZone 函数中收到此错误find_zones_from_district_id(...).then(...).catch is not a function。这是代码find_zones_from_district_id(district_id).then(function (data) {
  • @iamneaz,我认为这是由于 jquery Ajax 承诺返回他们自己的承诺。试试.fail(function(error) {})。 (见api.jquery.com/jQuery.ajax
  • @iamneaz 如果您执行了第三步并直接返回 ajax 调用注意 ajax() 返回jQuery's own structure jqxhr 对象,而不是真正的 Promise,它不会有 catch() 方法。改用.fail() 或使用then() 的第二个参数设置错误回调,例如.then(function(){}, function(){/*error callback*/})
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 2017-08-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多