2015-06-05 53 views
1

我有render(value)函數,我用不同的參數多次調用。我需要將調用鏈接到此函數,以便僅在前一個調用完成時纔開始執行。如何動態添加函數到隊列中?

我需要鏈中的函數返回一個承諾:

function render(value){ 
    var deferred = $q.defer(); 

    /* Some logic here */ 

    return deferred.promise; 
} 

我應該發生在這裏?

function onClick(value){ 
    /* 
     Add render(value) to the queue. And start execution if queue is empty 
    */ 
} 
+0

@Benj aminGruenbaum我需要動態添加函數到隊列中。所以它的執行只在隊列中的所有先前的承諾都已解決時纔開始執行。 – Websirnik

回答

1

這只是then鏈接 -

創建隊列:在您的示例

queue = queue.then(function(){ // need to reassign since promises are immutable. 
    console.log("Added!"); 
}); 

所以:

var queue = $q.when(); 

添加到隊列運行功能

function onClick(value){ 
    queue = queue.then(function(){ return render(value); }); 
} 
+0

謝謝!正是我在找什麼! – Websirnik

+0

乾杯,諾言基本上就是一個隊列:) –

0

你可能想嘗試沿着線的東西:

var lastPromise; 

function onClick(value) { 
    var promise; 

    if(lastPromise) { 
     promise = lastPromise.then(function() { 
      return render(value); 
     }).then(cleanup); 
    } 
    else { 
     promise = render(value).then(cleanup); 
    } 

    lastPromise = promise; 

    function cleanup() { 
     if(promise === lastPromise) { 
      lastPromise = null; 
     } 
    } 
} 

lastPromise保持了鏈接最後的承諾;這確保每個render()將在前一個完成後運行。內部promise是「私人」承諾的概念。如果當我們解決問題時,私人承諾與最後的承諾是一致的,那麼我們就清理它。警告:未經測試!