0
在我的網頁我有那採取的網址輸入的形式
<div ng-repeat="parent in parents">
<input ng-model="parent.url" type="text" />
</div>
<button ng-click="addParent()"> Add new link </button>
後來我有按鈕NG單擊,在調用一個函數我控制器,它檢查(異步)是否存在包含這些URL的頁面,以及其他一些(同步)檢查。
不知何故,我需要等待結果處理,收集它們,然後根據這些結果顯示一些內容。我試圖遍歷所有$ HTTP調用每個URL:
var results = [];
for (let i = 0; i < parents.length; i++) {
let p = parents[i];
$http.get(p.url).
then((res) => { // pages exists
results.push(true);
}, (err) => { // page doesn't exist
results.push(false);
});
}
但這將返回一個空列表,因爲$ HTTP調用是異步的。然後,我真的不能檢查所有我的結果是這樣的:
if(sync_values){ // this is fine
if(async_values){ // this is never filled in
// do something
}
}
我如何檢查我的結果畢竟$ HTTP調用?
UPDATE:
我試圖實現與$q.all()
一個工廠,將收集的承諾和解決這些問題。棘手的一點是解決價值而不是承諾;我需要知道哪些頁面存在以及哪些頁面丟失了。所以我設法想出爲我廠下面的代碼:
let deferred = $q.defer();
let promises = [];
angular.forEach(parents, function(parent) {
promises.push($http.get(parent.url).then((res) => {
return true;
}, (err) => {
return false;
}));
});
$q.all(promises).
then((res) => {
deferred.resolve(res);
});
return deferred.promise;
現在我回到布爾值的列表(我知道哪些頁面存在,不)。
我用稍微修改的方法,在這裏我推了整個$ http.get成'promises'。我也爲此製造了一個工廠,將邏輯從控制器中移出。 –