AngularJS:从工厂,如何在一个循环中调用另一个函数

时间:2016-01-20 20:09:52

标签: angularjs cordova angular-promise angularjs-factory

这是我的代码片段:

_service.factory('$opSQL', [ '$rootScope', '$cordovaSQLite',

     function($rootScope, $cordovaSQLite){

         var db = $cordovaSQLite.openDB(  "my.db" );
         var dbURL = dbConfig.remoteUrl;

         var opSQL = {
           deleteRow : function(row) {

              var strQuery = "DELETE FROM UpdateTo WHERE id = ? ;";
              $cordovaSQLite.execute(db, strQuery, [row.id] )
                 .then(
                    function(res) {  console.log ( JSON.stringify(row.id)); },
                    function (err) {  console.log ( JSON.stringify(err));  });
            },

            sendToServer : function(tmp) {
                // where tmp = [ { "id":1, "other"="..." }, { "id":2, "other"="..." } ... ]
                for(x in tmp)
                {
                    opSQL.deleteRow(tmp[x]);
                }
           }
         }
         return opSQL;
     }
]);

我认为问题在于sqlite执行的异步,因为查询成功完成但在控制台中我只读取了列表的第一个id。

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我的建议,函数deleteRow应该返回一个promise。函数sendToServer也应该返回一个你可以等待的promise。它还应该收集来自数组中调用deleteRow的promise并等待所有它们完成。如下所示:

sendToServer : function(tmp) {
  var promise = new Promise();

  var promiseArray = [];
  for(x in tmp)
  {
    promiseArray.push(opSQL.deleteRow(tmp[x]));
  }

  Promise.all(promiseArray).then(function() {
    // all successful
    promise.resolve();
  }).catch(function() {
    // something went wrong
    promise.reject();
  });

  return promise; // <-- the caller should wait on this promise
}

根据您正在使用的promise库中提供的函数名称进行调整。

希望这很有用。