Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.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 使用参数异步调用方法_Javascript_Jquery_Asynchronous - Fatal编程技术网

Javascript 使用参数异步调用方法

Javascript 使用参数异步调用方法,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,下面是一个例子: 为什么在使用参数调用函数fct1时,函数之间失去了异步性。 函数的执行顺序为:fct3、fct2、fct1,而不是fct1、fct2、fct3 function fct1(param1) { var d = $.Deferred(); setTimeout(function() { console.log("fct1 : param1 =" + param1); d.resolve(); }, 3000); return d.prom

下面是一个例子: 为什么在使用参数调用函数fct1时,函数之间失去了异步性。 函数的执行顺序为:fct3、fct2、fct1,而不是fct1、fct2、fct3

function fct1(param1) {
  var d = $.Deferred();
  setTimeout(function() {
      console.log("fct1 : param1 =" + param1);
      d.resolve();
    }, 3000);
  return d.promise();
};


function fct2() {
  var d = $.Deferred();
  setTimeout(function() {
      console.log("fct2");
      d.resolve();
    }, 2000);
  return d.promise();
};

function fct3() {
  var d = $.Deferred();
  setTimeout(function() {
      console.log("fct3");
      d.resolve();
    }, 1000);
  return d.promise();
};


var fct_array = [fct1(1), fct2, fct3];

var d = $.Deferred().resolve();
while (fct_array.length > 0) {
  d = d.then(fct_array.shift());
}
将fctl()函数定义更改为:

function fct1(param){

  var p =param;
  var f = function(p){  
      var d = $.Deferred();
      setTimeout(function() {
              console.log("fct1 : p=" + p);
          d.resolve();
        }, 5000);
      return d.promise();
  }

  return f.bind(this,p);
};
原因是,在初始化数组时,在执行函数
fctl(1)
之前。因此,后来一个调用
。然后它所做的
已经解决了

注意:无需更改while循环,因为您正在将对象d重新初始化为
d=d.then(fct_array.shift())
因此,

实现

将fctl()函数定义更改为:

function fct1(param){

  var p =param;
  var f = function(p){  
      var d = $.Deferred();
      setTimeout(function() {
              console.log("fct1 : p=" + p);
          d.resolve();
        }, 5000);
      return d.promise();
  }

  return f.bind(this,p);
};
原因是,在初始化数组时,在执行函数
fctl(1)
之前。因此,后来一个调用
。然后它所做的
已经解决了

注意:无需更改while循环,因为您正在将对象d重新初始化为
d=d.then(fct_array.shift())
因此,


实现

它是“异步”而不是“同步”,这意味着第一个更快。。。fct3是1000 fct2是2000 fct3是3000,所以一切都很完美。可能是因为超时,我想用参数按顺序执行这些函数(fct1、fct2、fct3),我不知道为什么在为函数fc1添加参数时,函数之间会失去同步?它是“异步”而不是“同步”,这意味着第一个函数的速度更快。。。fct3是1000 fct2是2000 fct3是3000,所以一切都很完美。可能是因为超时,我想用参数按顺序执行这些函数(fct1,fct2,fct3),我不知道为什么当我为函数fc1添加参数时,我会在函数之间失去同步?我的问题是,例如,如何使用参数调用fct1而不会在函数之间失去同步?我测试你的反应我失去同步!!!虽然循环很好,但只需更改fctl(param)函数定义即可。我测试了您的解决方案,但很遗憾,它不起作用。我想,因为在我生成的函数(返回d.promise();)中,您有什么建议吗?我的问题是,例如,如何使用参数调用fct1而不丢失函数之间的同步?我测试你的反应我失去同步!!!虽然循环很好,但只需更改fctl(param)函数定义即可。我测试了您的解决方案,但很遗憾,它不起作用。我想是因为在我做的函数中(返回d.promise();)你有什么建议吗?