2014-02-28 195 views
0

我的應用程序加載時運行的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 
     }; 
    }]); 

我會很感激在正確的模式是做承諾的鏈條,包括迭代了任何指導

控制器跨越多個異步交易 - 我知道我現在擁有的是不是正確的。

+0

很難按照你的代碼,但你爲什麼不只是每交易延期,並使用'$ q.all'等待他們全部化解? – jraede

回答

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 
+0

這正是我所要求的 - 我並不知道$ q.all。當然,Angular會有這樣的內置內容!感謝指針。 – Ila

相關問題