javascript - 带参数异步调用方法

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

最佳答案

将 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);
};

原因是在初始化数组fct_array时执行函数fctl(1)之前。因此后来调用 .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

关于javascript - 带参数异步调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39834373/

相关文章:

javascript - 似乎无法 trim 所有前导空格 - JavaScript 或 jQuery

javascript - 如何停止显示 window.status?

c# - 有什么命令可以立即更新用户界面吗?

javascript - 使用 Express 从 Javascript 向 Node.js 发送/接收数据

javascript - (JavaScript) 如何在 Phaser 3 中将图像定义为变量

javascript - HTML 5 图片调整大小

swift - 等待具有异步操作的函数完成

c# - 对调度程序和异步感到困惑

javascript - 从 Angular 服务中删除对象

javascript - 如何在第一次点击后禁用触发点击