2012-08-15 106 views
1

对不起,如果这是重复的,但我在以前的帖子中找不到任何令人满意的答案。如何从成功回调中提取Ajax响应数据

$(function() { 
    $.ajax({ 
     url: 'ajax/test.html', 
     success: function(data) { 
      // Data received here 
     } 
    }); 
}); 

[或]

someFunction() { 
    return $.ajax({ 
     // Call and receive data 
    }); 
} 

var myVariable; 

someFunction().done(function(data) { 
    myVariable = data; 
    // Do stuff with myVariable 
}); 

上面的代码工作得很好。然而,这个ajax请求是在页面加载时完成的,我想稍后处理这些数据。我知道我可以在回调中包含处理逻辑,但我不想这样做。由于调用的异步特性,将响应分配给全局变量不起作用。

在上述两种方式中,'数据'被限制为成功回调或完成回调,并且如果可能的话,我想在这些之外访问它。这在jQuery的'async:false'标志之前是可以实现的,但是在jQuery 1.8中不赞成使用。

任何建议表示赞赏。谢谢。

+0

当你要处理的数据吗?在按下按钮之类的事件之后? – 2012-08-15 10:04:04

+0

类似的东西......我的问题是,ajax请求是第一件事发生,因此我必须在此回调中添加剩余的应用程序逻辑[依赖于数据],这一切都变得非常迅速。 – Sparda 2012-08-15 10:06:08

回答

3

可以“外包”回调到正常的功能,所以你可以把它的地方,你喜欢它:

$(function() { 
    $.ajax({ 
     url: 'ajax/test.html', 
     success: yourOwnCallback 
    }); 
}); 

somehwere否则你可以定义你的回调

function yourOwnCallback(data) { 
    // Data received and processed here 
} 

这是甚至可能的物体方法

+0

感谢您的努力。 Upvoted。 – Sparda 2012-08-15 10:24:57

+3

请注意ajax文档中的弃用通知:'弃用声明:jQuery 1.8中不推荐使用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调。要准备代码以便最终删除它们,请改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。我认为使用'.done'比'success:'更受欢迎。不像'success','.done'方法被链接到ajax调用。 – Nope 2012-08-15 10:48:24

+0

感谢您的建议弗朗索瓦。 – Sparda 2012-08-15 11:05:30

1

这种解决方案可能不是想法,但我希望它有帮助。

  • 在回调时设置变量。
  • 无论你需要处理数据,检查是否设置了变量,如果不是等待。

尝试:

$(document).ready(function(){ 
    var myVar = false; 
    $.ajax({ 
     url: 'ajax/test.html', 
     success: function(data) { 
      myVar=data; 
     } 
    }); 

    someFunction(){ //this is invoked when you need processing 
     while(myVar==false){} 
     ... do some other stuff .. 
    } 
}); 

或者

someFunction(){ 
    if(myVar==false){ 
     setTimeout(someFunction(),100); //try again in 100ms 
     return; 
    } 
.. do some other stuff .. 
} 
+0

谢谢......等待某种方式是困难的部分虽然.. :) – Sparda 2012-08-15 10:21:14

+0

@Sparda:不幸的是,JavaScript并没有真正的阻塞休眠功能,所以你必须将代码放在一个函数中,并继续玩setTimeout:/你也可以使用[jQuery().when](http://api.jquery.com/jQuery.when/),但我认为这不会更容易。 – 2012-08-15 10:22:44

+0

感谢您的努力。 Upvoted。 – Sparda 2012-08-15 10:24:24