2016-10-03 111 views
0

下面的例子: 爲什麼當我調用功能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()); 
} 
+0

這是 「異步」 不是 「同步」 ,這意味着第一個更快...... fct3是1000 fct2是2000 fct3是3000,所以一切都很完美。 –

+0

也許這是因爲超時 –

+0

我想按順序執行這些函數(fct1,fct2,fct3),我不知道爲什麼當我爲函數fc1添加參數時我失去了函數之間的同步? – collo21

回答

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

原因是,你在哪裏之前在初始化陣列fct_array時執行功能fctl(1)。因此後來的一個呼叫.then它已經解決了。

注:無需更換while循環,你正在重新初始化對象d爲d=d.then(fct_array.shift()); 因此,

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

+0

我的問題我怎麼可以例如調用fct1參數而不失去功能之間的同步?我測試你的迴應我失去同步! – collo21

+0

明白了你的觀點,給我一點時間 – Nivesh

+0

while循環沒問題,只需改變fctl(param)函數的定義即可。 – Nivesh