我的應用程序加載時運行的PhoneGap/AngularJS應用程序上有一項服務SQLService
。它遍歷很長的數組Guidelines
,併爲每個數據庫創建一個數據庫事務。我如何表示最終交易已完成?如何知道在AngularJS中完成一系列異步調用的時間?
我想有發生的情況是這樣的:
In the controller, call `SQLService.ParseJSON`
ParseJSON calls `generateIntersectionSnippets`
`generateIntersectionSnippets` makes multiple calls to `getKeywordInCategory``
When the final call to getKeywordInCategory is called, resolve the whole chain
SQLService.ParseJSON is complete, fire `.then`
我真不明白瞭如何在多個異步調用這裏結合起來。 ParseJSON
返回一個承諾,當generateIntersectionSnippets()
完成時將被解決,但generateIntersectionSnippets()
對getKeywordInCategory
進行多次調用,該調用也返回承諾。
下面是什麼不起作用的簡化版本(對任何錯位的括號表示歉意,這是非常嚴格的)。
我想要發生的是爲$scope.ready = 2
在所有交易完成時運行。現在,只要程序通過generateIntersectionSnippets
循環一次,它就會運行。
SQLService.parseJSON().then(function(d) {
console.log("finished parsing JSON")
$scope.ready = 2;
});
服務:
.factory('SQLService', ['$q',
function ($q) {
function parseJSON() {
var deferred = $q.defer();
function generateIntersectionSnippets(guideline, index) {
var snippet_self, snippet_other;
for (var i = 0; i < guideline.intersections.length; i++) {
snippet_self = getKeywordInCategory(guideline.line_id, snippets.keyword).then(function() {
//Should something go here?
});
snippet_other = getKeywordInCategory(guideline.intersections[i].line_id, snippets.keyword).then(function() {
//Should something go here?
});
}
}
deferred.resolve(); //Is fired before the transactions above are complete
}
generateIntersectionSnippets();
return deferred.promise;
} //End ParseJSON
function getKeywordInCategory(keyword, category) {
var deferred = $q.defer();
var query = "SELECT category, id, chapter, header, snippet(guidelines, '<b>', '</b>', '...', '-1', '-24') AS snip FROM guidelines WHERE content MATCH '" + keyword + "' AND id='" + category + "';",
results = [];
db.transaction(function(transaction) {
transaction.executeSql(query, [],
function(transaction, result) {
if (result != null && result.rows != null) {
for (var i = 0; i < result.rows.length; i++) {
var row = result.rows.item(i);
results.push(row);
}
}
},defaultErrorHandler);
deferred.resolve(responses);
},defaultErrorHandler,defaultNullHandler);
return deferred.promise;
}
return {
parseJSON : parseJSON
};
}]);
我會很感激在正確的模式是做承諾的鏈條,包括迭代了任何指導
控制器跨越多個異步交易 - 我知道我現在擁有的是不是正確的。
很難按照你的代碼,但你爲什麼不只是每交易延期,並使用'$ q.all'等待他們全部化解? – jraede