【问题标题】:Conditionally add to jQuery .when有条件地添加到 jQuery .when
【发布时间】:2014-04-10 18:53:23
【问题描述】:

当我的页面加载时,我会进行一次 AJAX 调用,然后根据页面上的内容进行另一次调用。我想在两者结束时调用一个函数;我该怎么做?

var dfd = $.when( $.ajax(...) );

if( $("type").val() == "something" ) {
  dfd.when( $.ajax(...) );
}

dfd.then(function() { 
   // final code
});

我找不到太多关于添加到 $.when "conditionally" 或“稍后”的内容,因为这些搜索词太接近承诺本身的原始目的,所以我只是得到 $.when(a, b).then(c) 的标准用法

谢谢

【问题讨论】:

  • dfd 应该等于 $.ajax(...)

标签: jquery promise jquery-deferred .when


【解决方案1】:

您的代码应该看起来更像这样:

var dfd = $.ajax(...);
var dfd2 = $.ajax(...);

var deferreds = [];

if($("type").val() == "something")
    deferreds.push(dfd)

if($("other").val() == "somethingElse")
    deferreds.push(dfd2)

$.when.apply( $, deferreds )
  .then( callback, failureCallback );

参考:https://api.jquery.com/jQuery.when/

【讨论】:

  • 或者更确切地说是var deferreds = [$.ajax(...)];,然后是deferreds.push($.ajax(...))。他想要进行不止一个 AJAX 调用。
  • @RocketHazmat 我不确定你的意思。你想用 deferred 初始化数组,然后再将相同的 deferred 推入它吗?我试图编写上面的代码,以便 OP 可以轻松地引入更多具有更多条件的延迟对象,以防他的示例很简单。如果我错过了船,请告诉我。
  • 您想将 2 个延迟推入数组。他正在进行 2 个 ajax 调用。一个在if 之外,一个在if 内,都需要在数组中。
  • .apply - 那是缺少的关键!谢谢!!
  • 请注意,此答案中的代码确实总是进行两个 ajax 调用,但只是有条件地等待其中一些调用。
【解决方案2】:

我已经使用 Q.js 库成功地做到了这一点; http://documentup.com/kriskowal/q/

$ajax(...).then(function(val){
     if($("type").val() == "something") { return $.ajax(...);}
)};

【讨论】:

    【解决方案3】:

    要执行问题要求的操作(执行一个呼叫,然后可选地调用第二个呼叫),Epic 先生的答案可以按以下方式修改。基本上,我已经将 ajax 调用封装在函数中,因此只有在条件为真时才会调用 dfd2。

    var dfd = function () { 
       $.ajax(...); 
    };
    var dfd2 = function () { 
        $.ajax(...); 
    };
    
    var deferreds = [];
    
    deferreds.push(dfd())
    
    if($("type").val() == "something")
        deferreds.push(dfd2())
    
    $.when.apply( $, deferreds )
      .then( callback, failureCallback );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      相关资源
      最近更新 更多