2016-11-03 24 views
0

我有這樣的代碼:

var promiseArr = [], 
    innerPromises = [], 
    innerIndex = 0; 

angular.forEach(some_object, function (value, key) { 
    console.log(1); 
    innerPromises[innerIndex] = $q.defer(); 
    promiseArr.push(innerPromises[innerIndex].promise); 
    (function(innerIndex) { 
     func_returning_promise(args).then(function(data) { 
      console.log(2); 
      // Some code working on returned data 
      innerPromises[innerIndex].resolve(true); 
     }); 
    })(innerIndex); 

    innerIndex++; 
}); 

$q.all(promiseArr).then(function() { 
    console.log(3); 
}); 

forEach運行3次。預期的結果將是

1 
1 
1 
2 
2 
2 
3 

3出來之前2秒和後1 S,這似乎完全不合乎邏輯給我! innerPromises未解析,但2已記錄。

感謝任何幫助。

+1

不是我的答案的一部分,所以我將添加爲評論:您不必明確創建內部承諾。 'func_returning_promise(args).then(...)'返回一個承諾,所以你可以將它推到你的承諾數組上,當成功函數完成時它會自動解析或拒絕。 – Duncan

回答

1

我的猜測是,在提取代碼的位而不是發佈一個完整的例子,你已經改變了行爲。最有可能在您的原始forEach()也在一個異步回調,這意味着$q.all()是在一個空的列表上運行,並立即解決。

所以我建議的順序是:

  1. 你不顯示一些東西,馬上解決一個承諾A.
  2. $q.all()一個空的列表,以便諾言B檢查返回 解決了在運行。
  3. Angular運行承諾A的成功功能,運行 forEach循環並打印所有1並將承諾附加到 數組中。
  4. 然後它運行承諾B的成功功能,打印 3
  5. 然後其他承諾完成並打印2
2

你的代碼似乎不完整,無論如何經過一些改編後,我能夠讓你的代碼在jsfiddle上工作。 https://jsfiddle.net/yw6qztxm/

angular.module('indexApp', []).controller('indexController', function($q, $timeout) { 

var promiseArr = [], 
    innerPromises = [], 
    innerIndex = 0; 

var some_object = { 1:1, 2:2, 3:3 } 
var args = false; 

function func_returning_promise() { 
    return $q(function(resolve) { 
    $timeout(resolve, 100 + 100 * innerIndex); 
    }); 
} 

angular.forEach(some_object, function (value, key) { 
    console.log(1); 
    innerPromises[innerIndex] = $q.defer(); 
    promiseArr.push(innerPromises[innerIndex].promise); 
    (function(innerIndex) { 
     func_returning_promise(args).then(function(data) { 
      console.log(2); 
      // Some code working on returned data 
      innerPromises[innerIndex].resolve(true); 
     }); 
    })(innerIndex); 

    innerIndex++; 
}); 

$q.all(promiseArr).then(function() { 
    console.log(3); 
}); 

}); 

它做什麼預期,在3登錄去年,也許你應該與丟失的函數和變量的工作示例。