【问题标题】:jQuery - deferring ajax function return on success only?jQuery - 仅在成功时延迟 ajax 函数返回?
【发布时间】:2011-07-13 14:20:16
【问题描述】:

我已经设置了一些代码,我想要一个非常简单的 API 来处理 ajax 请求。

所以,我想做的只是以某种方式使用 deferred 来返回成功。

var factory = function(dataParams) {
    return $.ajax({
        type       : "POST",
        dataType   : "json",
        url        : "http://example.com/whatever",
        data       : dataParams,
        beforeSend : function(jqXHR, settings){/*... something here ...*/},
        error      : function(jqXHR, textStatus, errorThrown){/*... something here ...*/},
        complete   : function(jqXHR, textStatus) {/*... something here ...*/}
});

会被诸如

之类的东西调用
var dataTools = {
    "foo" : function(){
        factory({"One": 1}).success(function(jqXHR){
            //Do something to jqXHR
            //Return something to the "upper most" calling... how?
        })
    }
    "bar" : function(){
        factory({"Two": 2}).success(function(jqXHR){
            //Return jqXHR to the "upper most" calling... how?
        })
    }
};

这样我就可以这样使用它了:

$.each(dataTools.foo(), function(k,v){
    console.log(v);
});

基本上,对象dataTools.foo 会从成功返回一个值,或者应该在失败或跳过该代码分支的情况下返回一个空集。

我尝试使用 $.when().then(),但我似乎无法弄清楚如何将其融入我在这里描述的内容中。

【问题讨论】:

  • 您的意思是写var dataTools = { 吗?
  • 你“推迟”成功函数的目的是什么?您是否正在尝试构建可重用的请求对象?
  • @Derek Adair,是的。我想用它来获取一些数据,并在完成后返回所有内容,而不是使用回调。

标签: jquery ajax asynchronous jquery-deferred


【解决方案1】:

Ajax 是异步的。

您不能在异步函数上使用$.each。

你不能让一个函数调用一个调用 ajax 的函数然后期望使用$.when 和相关函数。

您需要执行 doc

中所说的操作

试试这样的:

var dataTools = {
    "foo" : function(){
        $.when(factory({"One": 1})).done(function(a1, a2){
            var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
        });
    }
    "bar" : function(){
        $.when(factory({"Two": 2})).done(function(a1, a2){
            var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
        });
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多