将条件应用于 jQuery.when() 延迟函数

Seb*_*ien 1 javascript jquery promise .when

我想对$.when()函数中的每个延迟请求应用一个条件(在发出请求之前)。但是在if里面放置条件会$.when返回错误。

做我在下面描述的事情的正确方法是什么?

$.when(
  if(var1) {
    $.getJSON(url1, function(data) {...}),
  },
  if(var2) {
    $.getJSON(url2, function(data) {...}),
  },
  if(varN) {
    $.getJSON(urlN, function(data) {...}),
  },
).then(function() {
  ...
});
Run Code Online (Sandbox Code Playgroud)

Ter*_*rry 7

您可以简单地构造一个 AJAX 承诺数组。之后,使用$.when.apply($, <yourArray>). 为了说明解决方案,以下是基于您提供的代码的示例:

// Construct array to store requests
var requests = [];

// Conditionally push your deferred objets into the array
if(var1) requests.push($.getJSON(url1, function(data) {...}));
if(var2) requests.push($.getJSON(url2, function(data) {...}));
if(var3) requests.push($.getJSON(url3, function(data) {...}));

// Apply array to $.when()
$.when.apply($, requests).then(function() {
  // Things to do when all is done
});
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,这里是一个显示概念验证示例的代码片段:我正在使用JSONPlaceholder返回的虚拟 JSON :

// Construct array to store requests
var requests = [];

// Conditionally push your deferred objets into the array
if(var1) requests.push($.getJSON(url1, function(data) {...}));
if(var2) requests.push($.getJSON(url2, function(data) {...}));
if(var3) requests.push($.getJSON(url3, function(data) {...}));

// Apply array to $.when()
$.when.apply($, requests).then(function() {
  // Things to do when all is done
});
Run Code Online (Sandbox Code Playgroud)
$(function() {
  // Construct array to store requests
  var requests = [];
  
  // Conditional vars
  var var1 = true,
      var2 = false,
      var3 = true;

  // Conditionally push your deferred objets into the array
  if (var1) requests.push($.get('https://jsonplaceholder.typicode.com/posts/1', function(data) {  return data;
  }));
  if (var2) requests.push($.get('https://jsonplaceholder.typicode.com/posts/2', function(data) {  return data;
  }));
  if (var3) requests.push($.get('https://jsonplaceholder.typicode.com/posts/3', function(data) {  return data;
  }));

  // Apply array to $.when()
  $.when.apply($, requests).then(function(d) {
  
    // Log returned data
    var objects = arguments;
    console.log(objects);
  });
});
Run Code Online (Sandbox Code Playgroud)