2014-10-08 48 views
0

我試圖逃避厄運金字塔。試想一下,下面的函數調用系列:是否有任何模式來編排除Promises之外的函數調用?

$.wait(1000).done(function() { 
    //Do something 

    $.wait(5000).done(function(){ 
     //Do something else 

     $.wait(2200).done(function(){ 
      //Do something else 
     }); 
    }); 
}); 

凡$ .wait函數定義爲:

$.wait = function (duration) { 
    return $.Deferred(function (dfd) { 
     setTimeout(dfd.resolve, duration); 
    }); 
}; 

的問題是,我怎麼能重構上面的代碼,使之成爲可讀/維護?

回答

1

那麼,你已經承諾(或至少,延期)在你的代碼,所以沒有很好的理由尋找不同的編碼模式。通過然而flatten your callback pyramid您可以鏈接承諾回調與allmighty then method築巢,而不是他們(與done):

$.wait(1000).then(function() { 
//   ^^^^ 
    //Do something 
    return $.wait(5000); 
// ^^^^^^ 
}).then(function() { 
// ^^^^ 
    //Do something else 
    return $.wait(2000); 
// ^^^^^^ 
}).then(function() { 
// ^^^^ 
    //Do something else 
}); 

這是完全等同於你的代碼。

相關問題