【问题标题】:How to extract ajax response data from the success callback如何从成功回调中提取ajax响应数据
【发布时间】:2012-08-15 09:51:29
【问题描述】:

对不起,如果这是重复的,但我在以前的帖子中找不到任何令人满意的答案。

$(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 中已弃用。

感谢任何建议。谢谢。

【问题讨论】:

  • 您希望何时处理数据?发生某些事件,例如按下按钮?
  • 类似的东西......我的问题是,ajax 请求是发生的第一件事,因此我必须在这个回调中添加剩余的应用程序逻辑[取决于数据]这一切都很快变得一团糟。

标签: javascript ajax jquery


【解决方案1】:

你可以将回调“外包”给一个普通函数,这样你就可以把它放在你喜欢的地方:

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

还有一些你可以定义你的回调

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

这甚至可以通过对象方法实现

【讨论】:

  • 请注意 ajax 文档中的弃用通知:Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks will be deprecated in jQuery 1.8. To prepare your code for their eventual removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead. 我认为使用.done 优于success:。与success 不同,.done 方法链接到 ajax 调用。
  • 感谢弗朗索瓦的建议。
【解决方案2】:

这个解决方案可能不是主意,但我希望它有所帮助。

  • 在回调时设置变量。
  • 无论您需要在何处处理数据,请检查是否设置了变量,如果没有以某种方式等待。

试试:

$(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 ..
}

【讨论】:

  • 谢谢...虽然等待是最困难的部分..:)
  • @Sparda:不幸的是 JavaScript 并没有真正的阻塞睡眠功能,所以你必须将代码包含在一个函数中并继续使用 setTimeout :/ 你也可以使用jQuery().when,但我认为这不会更容易。
  • @Sparda:希望对您有所帮助。遗憾的是 JavaScript 并没有让我们轻松地做这些事情。
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 2020-05-05
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多