使用参数

时间:2016-10-03 14:46:45

标签: 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.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());
}

1 个答案:

答案 0 :(得分:2)

将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)时执行函数fct_array之前。因此,稍后调用它.then已经解决了。

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

while (fct_array.length > 0) {
  d = d.then(fct_array.shift());
}

/* is equal to :
d=d.then(fct_array.shift()).then(fct_array.shift()).then(fct_array.shift());
*/

实施JSBin