$q
promise 是使用 AngularJS 時相當重要的一環,熟悉並活用之後可以讓許多原本看似較雜亂的 event-base 程式碼看起來謹然有序(當然也不是所有的 event-base 程式都適合使用 promise 來實現)。
排隊的需求
有時候我們會碰到一些特別的情況:
一段一段的動作是依序進行,但觸發的時候卻又是一次性的(比如說在一個 loop 中一次排定 10 個非同步的工作,需要依序執行)。
用程式碼表示大概是這樣:
var taskIds = [1, 2, 3, 4, 5];
angular.forEach(taskIds, function (taskId) {
// 以 $http 為例
$http.get('/someUrl', {params: {taskId: taskId}});
});
console.log('工作順利完成!');
然而我們真正想做的事情是這樣:
$http.get('/someUrl', {params: {taskId: 1}})
.then(function () {
return $http.get('/someUrl', {params: {taskId: 2}});
})
.then(function () {
return $http.get('/someUrl', {params: {taskId: 3}});
})
.then(function () {
return $http.get('/someUrl', {params: {taskId: 4}});
})
.then(function () {
return $http.get('/someUrl', {params: {taskId: 5}});
})
.then(function () {
console.log('工作順利完成!');
});
在上面的例子中,工作只有五項所以固然可以自己打一打程式碼解決,一般來說碰到的情況會有下面的困境:
工作項目數未知(為動態的或為參數)
同時可以進行的工作數不只一項(以上面為例即 1, 2 可以同時進行,而 3, 4 可以同時進行,最後再單獨執行 5 即可)