Javascript 如何知道AngularJS中一长串异步调用何时完成?
我在我的PhoneGap/AngularJS应用程序上有一个服务Javascript 如何知道AngularJS中一长串异步调用何时完成?,javascript,angularjs,asynchronous,Javascript,Angularjs,Asynchronous,我在我的PhoneGap/AngularJS应用程序上有一个服务SQLService,它在应用程序加载时运行。它遍历一长串准则,并为每一个准则生成一个DB事务。我如何发出最终交易已完成的信号 我希望发生的事情是: In the controller, call `SQLService.ParseJSON` ParseJSON calls `generateIntersectionSnippets` `generateIntersectionSnippets` makes m
SQLService
,它在应用程序加载时运行。它遍历一长串准则
,并为每一个准则生成一个DB事务。我如何发出最终交易已完成的信号
我希望发生的事情是:
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
一次,它就会运行
在控制器中:
服务:
.factory('SQLService',['$q',
功能($q){
函数parseJSON(){
var deferred=$q.deferred();
函数generateIntersectionSnippets(指南、索引){
变量snippet_self,snippet_other;
对于(变量i=0;i
我希望您能给我一些指导,告诉我正确的模型是什么,以完成一系列承诺,其中包括跨多个异步事务的迭代——我知道我现在的做法根本不正确。您可以使用它来等待承诺列表得到解决
function parseJSON() {
var deferred = $q.defer();
var promiseList = [];
for (var i = 0; i < guideline.intersections.length; i++) {
promiseList.push(getKeywordInCategory(guideline.line_id, snippets.keyword));
promiseList.push(getKeywordInCategory(guideline.intersections[i].line_id, snippets.keyword));
}
$q.all(promiseList).then(function() {
deferred.resolve();
});
return deferred.promise;
} //End ParseJSON
函数parseJSON(){
var deferred=$q.deferred();
var promiseList=[];
对于(变量i=0;i
很难遵循您的代码,但为什么您不在每笔交易中使用一个延迟,然后使用$q.all
等待它们全部解决?这正是我所要求的-我不知道$q.all。当然,Angular会内置类似的东西!谢谢你的指点。
.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
};
}]);
function parseJSON() {
var deferred = $q.defer();
var promiseList = [];
for (var i = 0; i < guideline.intersections.length; i++) {
promiseList.push(getKeywordInCategory(guideline.line_id, snippets.keyword));
promiseList.push(getKeywordInCategory(guideline.intersections[i].line_id, snippets.keyword));
}
$q.all(promiseList).then(function() {
deferred.resolve();
});
return deferred.promise;
} //End ParseJSON