【问题标题】:jQuery Promise callback with Parameters带参数的 jQuery Promise 回调
【发布时间】:2012-08-03 04:24:34
【问题描述】:

我试图弄清楚如何将参数传递给由 jQuery 的 promise 对象触发的回调函数。我的方法,它调用 ajax 和 promise 方法如下所示:

var formObject = {
    call : function(thisForm, thisUrl, thisArray, thisCallback) {
        "use strict";
        var thisMethod = thisForm.attr('method').toUpperCase();
        var thisPromise = $.ajax({
            type : thisMethod,
            url : thisUrl,
            dataType : 'json',
            data : thisArray,
            cache : false
        });
        thisPromise.done(thisCallback(data, textStatus, jqXHR));
        thisPromise.fail(formObject.topError(jqXHR, textStatus, errorThrown));
    }
};

done() 和 fail() 方法中的参数不正确 - 但这正是我想要弄清楚的。

【问题讨论】:

    标签: ajax promise jquery


    【解决方案1】:

    试着改写

    thisPromise.done(function(data, textStatus, jqXHR) { 
        thisCallback(data, textStatus, jqXHR); 
    });
    thisPromise.fail(function(jqXHR, textStatus, errorThrown) { 
         formObject.topError(jqXHR, textStatus, errorThrown); 
    });
    

    将两个回调封装在一个函数中

    【讨论】:

    • @alnitak,假设我对thisCallbackformObject.topError 的存在一无所知......为什么它不应该工作?如果是由于缺少参数,我刚刚更新了我的答案:)
    • 是的,是缺少参数。参数在 OPs 代码中给出。您现在当然应该注意到提供的函数被传递完全相同与回调相同的参数...
    • 是的,我注意到 :) 他可以只传递函数标识符,但我想向用户展示如何传递带参数的函数,不管它们是什么(在这种特定情况下显然是多余的)
    • 那么你的意思是我可以简单地传递方法/函数名而不带任何参数,这些将传递给回调?
    【解决方案2】:

    使用闭包:

    var formObject = {
        call : function(thisForm, thisUrl, thisArray, thisCallback) {
            "use strict";
            var thisMethod = thisForm.attr('method').toUpperCase();
            var thisPromise = $.ajax({
                type : thisMethod,
                url : thisUrl,
                dataType : 'json',
                data : thisArray,
                cache : false
            });
            thisPromise.done(function(data, textStatus, jqXHR) {
                     thisCallback(/* additional parameters*/)
            });
    ..........................
        }
    };
    

    【讨论】:

      【解决方案3】:

      没有必要提供额外的闭包 - 下面的行应该可以正常工作:

      thisPromise.done(thisCallback);
      thisPromise.fail(formObject.topError.bind(formObject));
      

      done 回调将通过$.ajax 提供的data, textStatus, jqXHR 参数传递。这一行只是直接注册提供的回调函数。

      fail 回调同样会得到正确的参数,只是我在这里使用了.bind 来确保this 正确设置为formObject。如果要在 ES5 之前的浏览器上使用此代码,只需为 .bind 安装一个 shim - 上面链接的 Mozilla 网站上有一个。

      【讨论】:

      • @SpencerMark 是的,应该没问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 2021-01-28
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多