我的Ajax回调没有像我预期的那样工作

时间:2011-12-13 09:03:55

标签: jquery ajax callback

我以为我知道这是如何运作的 - 显然不是。

我无法返回从jQuery Ajax请求中获取的值。

这是我的代码:

  function initForm() {
    prefix = getPrefix(country_id);
    alert(prefix); // <-- prefix is empty
  }


  // Get prefix
  function getPrefix(country_id) {
    var prefix = '';

    jQuery.ajax({
      url: siteURL +"/wp-content/themes/storelocator/include/jquery.php",
      data: {instance: 'getPrefix', country_id : country_id},
      success: (function(data) {
          prefix = data.prefix;
          alert(prefix) // <--- This alerts correct value
      }),
      dataType: 'json'
    });

    return prefix; // <-- This value is not set
  }

如何正确使用回调在prefix来电中设置jQuery.ajax变量?

4 个答案:

答案 0 :(得分:2)

这是由于Ajax请求的异步行为造成的。在Ajax请求收到响应之前,getPrefix()函数将返回。您应该将回调函数传递给getPrefix(country_id)函数,例如:

function getPrefix(country_id, callback) {
    jQuery.ajax({
      url: siteURL +"/wp-content/themes/storelocator/include/jquery.php",
      data: {instance: 'getPrefix', country_id : country_id},
      success: (function(data) {
          callback.call(null, data.prefix);
      }),
      dataType: 'json'
    });
}

然后打电话如下:

function initForm() {
    getPrefix(country_id, function (prefix) {
        // 'prefix' is now available
    });
}

答案 1 :(得分:0)

未设置prefix的值,因为它是在ajax post获得响应并且触发回调之前返回的。

相反,请尝试

jQuery.ajax({
  url: siteURL +"/wp-content/themes/storelocator/include/jquery.php",
  data: {instance: 'getPrefix', country_id : country_id},
  success: (function(data) {
      prefix = data.prefix;
      alert(prefix) // <--- This alerts correct value
      return prefix;
    }),
    dataType: 'json'
    });
}

答案 2 :(得分:0)

这可能对你有用。由于Ajax调用是异步的,因此您需要使用回调来设置前缀变量。

function initForm() { 
   getPrefix(country_id); 
} 



function getPrefix(country_id) { 
var _this=this;

jQuery.ajax({ 
  url: siteURL +"/wp-content/themes/storelocator/include/jquery.php", 
  data: {instance: 'getPrefix', country_id : country_id}, 
  success: (function(data) { 
_this.setPrefix(data.prefix);       }), 
  dataType: 'json' 
}); 

}

function setPrefix(prefixData){
prefix = prefixData;
      alret(prefix);
}

答案 3 :(得分:0)

另一种方法是,虽然不推荐使用同步版本。

jQuery.ajax({
  url: siteURL +"/wp-content/themes/storelocator/include/jquery.php",
  data: {instance: 'getPrefix', country_id : country_id},
  success: (function(data) {
      prefix = data.prefix;
      alert(prefix) // <--- This alerts correct value
  }),
  async:false,
  dataType: 'json'
});

但我同意以前的答案。