【问题标题】:Jquery Ajax .done() behaviorJquery Ajax .done() 行为
【发布时间】:2014-08-14 23:47:48
【问题描述】:

我想知道下面代码的行为。 Ajax.chan(tid) 是下面的 ajax 调用。其他三个函数与 Ajax 无关。当我没有将参数传递给Display.channelLoad 时,代码会按预期工作,并且这些函数会在 ajax 完成后运行。但是如果我把它改成.done(Display.channelLoad()),这个函数会在ajax调用完成之前运行。这可能是我缺少的一些基本 javascript 知识,但我想将参数传递给 Display.channelLoad 并了解这里发生了什么。

AjaxCall.chan(tid).done(List.articles)
                  .done(Display.channelLoad)
                  .done(Display.unblockUI);

AjaxCall.chan()

var AjaxCall = {
    chan: function(tid) {
        return getArticles = $.ajax({
            url: "http://ainonline.com/api/channel/" + tid,
            context: document.body,
            dataType: 'jsonp'
        });
    }

谢谢。

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    来自.done 上的 jQuery 文档:

    deferred.done() 方法接受一个或多个参数,所有参数 可以是单个函数或函数数组。当。。。的时候 Deferred 被解决, doneCallbacks 被调用。回调是 按添加顺序执行。由于 deferred.done() 返回 deferred 对象,deferred 对象的其他方法可以 链接到这个,包括额外的 .done() 方法。当。。。的时候 Deferred 已解决,doneCallbacks 使用参数执行 按它们的顺序提供给resolve或resolveWith方法调用 添加。有关详细信息,请参阅延迟的文档 对象。

    这意味着在您的示例中,.done(List.articles) 被调用,结果为 $.ajax()。所以它会被jqXHR 对象调用,所以它看起来像这样:

    List.articles(data, textStatus, jqXHR)
    

    对于其他按顺序完成的调用也会发生同样的情况。

    【讨论】:

    • 谢谢,将var name 传递给List.articles 或任何其他函数有什么好的选择吗?或者我应该使用不同的设计方法。
    • 这是我找到的传递另一个参数的解决方案,promise.done(function(a,b,c) { onMyUrlLoaded(a, b, c, extraParam); });stackoverflow.com/questions/21985201/…
    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多