在运行代码之前等待jQuery $ .get函数完成

时间:2011-12-23 01:08:54

标签: javascript jquery ajax

在下文中,return语句正在执行之前$.get()的调用完成。我怎么能改变这个?

var aft = {};

aft.getToken = function (url) {

    var theToken;

    //Get the token value
    $.get(url, function (data) {

        theToken = $(data).find('input[name=__RequestVerificationToken]').val();

    }, "html");

    return theToken;

};

3 个答案:

答案 0 :(得分:4)

jQuery支持开箱即用,将选项async设置为false,函数调用将是同步的,而不是异步的。

虽然我建议您保持请求不同步,但请参阅本文末尾的“推荐的解决方案”。

  

async (布尔值)默认值:true

     

默认情况下,所有请求都是异步发送的(即设置为   默认为true)。如果需要同步请求,请将此选项设置为   假。跨域请求和dataType:“jsonp”请求没有   支持同步操作。

     

请注意,同步请求可能会   暂时锁定浏览器,在请求时禁用任何操作   很活跃。


但我使用$.get,这似乎是$.ajax特有的?

是的,但在引擎盖下它们完全是一样的。

  

jQuery.get()

     

这是一个简写的Ajax函数,相当于:

$.ajax({
  url: url,
  data: data,
  success: success,
  dataType: dataType
});

示例实施

aft.getToken = function (url) {
  var theToken;

  $.ajax({
    url: url,
    dataType: 'html'
    success: function (data) {
      theToken = $(data).find('input[name=__RequestVerificationToken]').val();
    },
    dataType: dataType
  });

  return theToken;
}

推荐的解决方案

正如前面提到的来自jQuery文档的评论所述,通常不建议使用异步请求,并且通常弊大于利。

相反,您应该尝试使用回调或类似方法来实现所要求的功能。

回调是传递给某个其他函数以处理某个事件的函数,例如数据检索的成功。正如您在自己的代码段中将回调传递给$.get一样。

让你的函数aft.getToken接受一个名为callback的第二个参数,它应该是一个函数引用。然后在数据检索和“解析”完成时,使用您的ajax请求回复的令牌作为参数调用此函数。

aft.getToken = function (url, callback) {
  var dst_object = this;

  $.get (url, function (data) {
    dst_object.stored_token = $(data).find (
      'input[name=__RequestVerificationToken]'
    ).val ();

    callback (dst_object.stored_token);
  }, "html");
};

...

aft.getToken ('/path/to/file.html', function (token) {
  console.log ("Got token: " + token);
});

...

console.log (aft.stored_token);

答案 1 :(得分:4)

你不能 - 至少不明智。虽然有一个async属性可以设置jQuery ajax请求,但我有严重问题尝试在过去使用false值。

尝试重新思考你想要实现的目标:

var aft = { yourToken: '' };

aft.setToken = function (url, callback) {
    $.get(url, function (data) {
        this.yourToken = $(data).find('input[name=__RequestVerificationToken]').val();

        if (callback)
           callback.apply(this);
    }, "html");
};

然后:

aft.setToken("url.php", function() {
   alert("Token retrieved = " + this.yourToken);
});

或者,如果您的回调需要访问返回的数据,那么您可以更简单地执行

if (callback)
    callback(data);

然后

aft.setToken("url.php", function(dataReturned) {
   alert("Ajax data retrieved = " + dataReturned);
});

答案 2 :(得分:0)

@Adam Rackis的回调代码正在为我工​​作。实际上,如果url的内容是json结构,你可以直接引用这样的字段。请注意,aft = {yourToken:''}只是假的,因为我根本没有使用这个字典中的值。我只是想从URL获取user_id。

var aft = { yourToken: '' };
    aft.setToken = function(url, callback){
        $.get(url, function(data) {
            user_id = data[0]['user_id'];
            if (callback)
                callback(data);
        });
    };

    aft.setToken("https://XXXXXX.azurewebsites.net/.auth/me",  function(dataReturned){
        alert("You user id is " + labeler);