Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么函数在数组中执行,而与jquery';一起使用时不执行;何时';_Javascript_Jquery_Arrays_.when - Fatal编程技术网

Javascript 为什么函数在数组中执行,而与jquery';一起使用时不执行;何时';

Javascript 为什么函数在数组中执行,而与jquery';一起使用时不执行;何时';,javascript,jquery,arrays,.when,Javascript,Jquery,Arrays,.when,我试图将动态函数传递给'when'语句,但是当'when'被注释掉时,仍然会从数组中调用这些函数 multiAjaxCalls(); function multiAjaxCalls() { var deferParams = []; var numOfAjaxToCall = 2; //could be 1 or 2 if (numOfAjaxToCall === 1) { deferParams = [ajax1('1')];

我试图将动态函数传递给'when'语句,但是当'when'被注释掉时,仍然会从数组中调用这些函数

multiAjaxCalls();
function multiAjaxCalls()
{
      var deferParams = [];
      var numOfAjaxToCall = 2; //could be 1 or 2
      if (numOfAjaxToCall === 1) {
            deferParams = [ajax1('1')];
      }
      else if (numOfAjaxToCall === 2) {
            deferParams = [ajax1('1'), ajax1('2')];
      }

      //If this is commented out then the function(s) in the array above still execute
      //If this is NOT commented out, the function only executes once
      $.when.apply($, deferparams).then(
          function () {
            console.log("all ajax calls have been completed, combination of data can happen now.");
            var objects = arguments;
            console.log(objects);
          },
          function (event) {
              console.log("failed in when ", event);
          }
      );

      function ajax1(posnum)
      {
            return ajaxCommon('https://jsonplaceholder.typicode.com' + '/posts/' + posnum);
      }
      function ajax2(posnum)
      {
            return ajaxCommon('https://jsonplaceholder.typicode.com' + '/posts/' + posnum);
      }

      function ajaxCommon(siteURL)
      {
            console.log("starting site url query: ", siteURL);
            return $.ajax({
                  url: siteURL,
                  method: 'GET'
            })
                  .done(function (data)
                  {
                        //console.log("DONE", data);
                        return data;
                  })
                  .fail(function (data)
                  {
                        //console.log("failed INSIDE AJAX URL:", siteURL, "Data: " , data);
                        return data;
                  })
      }
}
我从上面得到的控制台日志只发生一次(这是我所期望的):
开始站点url查询:
正在启动站点url查询:

如果我注释掉'when'块,使数组中的函数不再执行,那么我在控制台中得到相同的输出,这意味着数组中的函数仍在执行

为什么数组中的函数在使用“when”时执行一次,但在注释掉该块时仍然执行?另外,如果有更好的方法使用带有“when”的动态函数,请告诉我

谢谢。

请不要这样:

deferParams = [ajax1('1'), ajax1('2')];
这样做:

deferParams = [() => ajax1('1'), () => ajax1('2')];
在第一种情况下,当将它们传递到数组中时,实际上是在执行函数

编辑:

为了实现这一点,我对您的代码进行了一些重构:

function getPost(postNum) {
  console.log('Calling with', postNum);
  return ajaxCommon('https://jsonplaceholder.typicode.com' + '/posts/' + postNum);
}

function ajaxCommon(siteURL) {
  console.log("starting site url query: ", siteURL);
  return $.ajax({
    url: siteURL,
    method: 'GET'
  });
}

function multiAjaxCalls() {
  var numOfAjaxToCall = 2; //could be 1 or 2

  var posts = [];
  for (var i = 0; i < numOfAjaxToCall; i++) {
    posts.push(i);
  }

  $.when.apply(null, posts.map(p => getPost(p)))
    .then(function () {
      console.log("all ajax calls have been completed, combination of data can happen now.");
      var objects = arguments;
      console.log(objects);
    })
    .fail(function(e) {
        console.log('A call failed', e);
    });
}
函数getPost(postNum){ log('Calling with',postNum); 返回ajaxCommon('https://jsonplaceholder.typicode.com“+”/posts/“+postNum); } 函数ajaxCommon(siteURL){ log(“起始站点url查询:”,siteURL); 返回$.ajax({ url:siteURL, 方法:“获取” }); } 函数multiAjaxCalls(){ var numOfAjaxToCall=2;//可以是1或2 var posts=[]; 对于(var i=0;igetPost(p))) .然后(函数(){ log(“所有ajax调用都已完成,现在可以进行数据组合。”); 变量对象=参数; console.log(对象); }) .失败(功能(e){ log('A call failed',e); }); } 为了解决这个问题,我没有将已执行函数的数组传递给apply,而是使用map在apply中调用它们。它执行类似的操作,但仅当实际调用时才执行

这是一把小提琴:

而不是这个:

deferParams = [ajax1('1'), ajax1('2')];
这样做:

deferParams = [() => ajax1('1'), () => ajax1('2')];
在第一种情况下,当将它们传递到数组中时,实际上是在执行函数

编辑:

为了实现这一点,我对您的代码进行了一些重构:

function getPost(postNum) {
  console.log('Calling with', postNum);
  return ajaxCommon('https://jsonplaceholder.typicode.com' + '/posts/' + postNum);
}

function ajaxCommon(siteURL) {
  console.log("starting site url query: ", siteURL);
  return $.ajax({
    url: siteURL,
    method: 'GET'
  });
}

function multiAjaxCalls() {
  var numOfAjaxToCall = 2; //could be 1 or 2

  var posts = [];
  for (var i = 0; i < numOfAjaxToCall; i++) {
    posts.push(i);
  }

  $.when.apply(null, posts.map(p => getPost(p)))
    .then(function () {
      console.log("all ajax calls have been completed, combination of data can happen now.");
      var objects = arguments;
      console.log(objects);
    })
    .fail(function(e) {
        console.log('A call failed', e);
    });
}
函数getPost(postNum){ log('Calling with',postNum); 返回ajaxCommon('https://jsonplaceholder.typicode.com“+”/posts/“+postNum); } 函数ajaxCommon(siteURL){ log(“起始站点url查询:”,siteURL); 返回$.ajax({ url:siteURL, 方法:“获取” }); } 函数multiAjaxCalls(){ var numOfAjaxToCall=2;//可以是1或2 var posts=[]; 对于(var i=0;igetPost(p))) .然后(函数(){ log(“所有ajax调用都已完成,现在可以进行数据组合。”); 变量对象=参数; console.log(对象); }) .失败(功能(e){ log('A call failed',e); }); } 为了解决这个问题,我没有将已执行函数的数组传递给apply,而是使用map在apply中调用它们。它执行类似的操作,但仅当实际调用时才执行


这里有一个小问题:

那么,为什么在使用“when”块时它们不会被调用两次呢?什么是防止它们在数组中被调用的最好方法,同时仍然能够在'when'中执行它们呢?那么为什么在使用'when'块时它们不会被调用两次呢?什么是防止它们在数组中被调用的最好方法,同时仍然能够在“何时”中执行它们?我尝试了这个方法,但“何时”似乎不能正确执行。它输出:“所有ajax调用都已完成,现在可以进行数据组合了。”然而,它似乎没有调用要输出的函数:开始站点url查询:开始站点url查询:尝试以下操作:when:
$。when(deferParams)。然后…
不再使用applyI也尝试了,它仍然无法在控制台中生成任何内容@Rezzy我已经添加了一个带有JSIDdle的解决方案,请看一看,然后告诉我您的进展情况。谢谢Rick,我看不出JSIDdle代码有什么不同。我尝试了这个方法,但“when”似乎没有正确执行。它输出:“所有ajax调用都已完成,现在可以进行数据组合了。”然而,它似乎没有调用要输出的函数:开始站点url查询:开始站点url查询:尝试以下操作:when:
$。when(deferParams)。然后…
不再使用applyI也尝试了,它仍然无法在控制台中生成任何内容@Rezzy我已经添加了一个带有JSFIDLE的解决方案,请看一看,并告诉我您的进展情况。谢谢Rick,不过我看不出JSFIDLE代码有什么不同。