2015-04-22 74 views
3

我有以下一組數據。角度承諾序列循環

$scope.orders = [ 
     { material: 'A', quantity: 32, orderNumber: 'dummy'}, 
     { material: 'A', quantity: 65, orderNumber: 'dummy'}, 
     { material: 'A', quantity: 86, orderNumber: 'dummy'}, 

     { material: 'B', quantity: 45, orderNumber: 'dummy'}, 
     { material: 'B', quantity: 68, orderNumber: 'dummy'}, 
     { material: 'B', quantity: 15, orderNumber: 'dummy'}, 

     { material: 'C', quantity: 11, orderNumber: 'dummy'} 
    ]; 

我想處理(createOrder)按材料分組的訂單。在處理完特定物料的所有訂單後,我想調用另一個執行物料運行的功能(materialRun)。在此功能成功後,下一個材料(及其相應的訂單)必須進行處理等。所有這些調用都必須是順序的,因爲後端不能並行處理所有內容。

所以我在尋找這樣的事情:

材料A:爲了1 - > 2階 - > 3階 - > materialRun

當從A materialRun完成後,啓動材料B

材料B:順序1 - >順序2 - >順序3 - > materialRun

當從B materialRun完成後,開始材料C

...

我還需要從結果每個createOrder更新訂單列表

我採用了棱角分明的承諾現在,但我開放的建議。 我希望這個提琴可以幫助:http://jsfiddle.net/a1sp0ye2/

+1

值添加在郵政編碼你試試,不僅鏈接到小提琴。 – Grundy

+0

那麼你期望輸出什麼? – Grundy

+1

「*所有這些調用都必須是連續的,因爲後端無法並行處理所有內容。」 - 呃,你知道,也許你應該修復後端?至少如果你可以把所有更新放在一個請求中,並讓後端弄清楚如何處理它,這將是合理的。 – Bergi

回答

2

下面是一個模板,用於帶異步實體的循環,即下一次迭代必須在異步任務完成時纔會發生。它適用於在角度方面的承諾,但可以推廣到任何承諾的實現,我相信:在此基礎上

/** 
* Loop the items array asynchronously. 
* 
* @param items - Array to iterate 
* @param doLoopBody - Callback that executes the body loop, returns promise 
*/ 
function asyncLoop(items, doLoopBody) { 
    var i = 0, d = $q.defer(); 

    nextIteration(); 

    return d.promise; 

    function nextIteration() { 
     if(i < items.length) { 
      doLoopBody(items[i], i, items).then(
       function() { 
        i++; 
        nextIteration(); 
       }, 
       onError 
      ); 
     } 
     else { 
      d.resolve(); 
     } 
    } 

    function onError(reason) { 
     d.reject(reason); 
    } 
} 

here是原油實現你的案件(觀看瀏覽器的控制檯輸出)。

0

我不知道那是可以幫助你,但嘗試使用我的代碼:jsfiddle

 $scope.promises = []; 
     ordersByMaterial.forEach(function(order) { 
      $scope.promises.push(createOrder(order)); 
     }); 

我試圖通過創建$scope.logsCreateValue = [];,我保持距離Math.floor(Math.random() * 10);隨機值看向console.log($scope.logsCreateValue);進行測試,它應該匹配從$scope.orders[key].orderNumber = res[key].orderNumber;