有条件地添加到 jQuery .when

Posted

技术标签:

【中文标题】有条件地添加到 jQuery .when【英文标题】:Conditionally add to 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(...) 【参考方案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 );

【讨论】:

以上是关于有条件地添加到 jQuery .when的主要内容,如果未能解决你的问题,请参考以下文章

CASE 表达式 - 在 WHEN 部分再添加一个条件

Jquery有条件地加载到wordpress页面上

JQuery 有条件地提交表单

如何在 django 中向 Case、When 条件添加排序

如何在pyspark数据框中添加多个带有when条件的新列?

有条件地选择要在 FOR LOOP 中迭代的集合