如何知道AngularJS中何时完成了一系列异步调用?

时间:2014-02-28 01:16:57

标签: javascript angularjs asynchronous

我的PhoneGap / AngularJS应用程序上有一个服务SQLService,它在应用程序加载时运行。它遍历一长串Guidelines,并为每个进行数据库事务。如何表明最终交易已完成?

我想要发生的事情是:

 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
        };
  }]);

我很欣赏任何指导正确的模型来做一系列承诺,其中包括跨多个异步交易的迭代 - 我知道我现在拥有它的方式根本不正确。

1 个答案:

答案 0 :(得分:2)

您可以使用$q.all()等待要解决的承诺列表。

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