关于Angularjs延迟分辨位置



我有一个数据应该是一致性。但是我每个循环。我不确定我放置resolvereject位置正确。这是我的示例代码。

function getCount(content) {
  var deferred = $q.defer();
  db.transaction(function(tx){
    tx.executeSql(
      query,
      [data],
      function(tx, res) {
        var count = res.rows.item(0).cnt;
        if (count === 0) {
          var commit = content.commit;
          commit.forEach(function(entry) {
            tx.executeSql(
              query,
              [data],
              function(tx, res){
                deferred.resolve(res); // here is right?
              },
              function (e) {
                deferred.reject(e); // here is right?
              }
            );
          });
        }
        else{
          deferred.resolve(res);
        }
      },
      function (e) {
        deferred.reject(e);
      }
    );
  });
}

我认为resolvereject应该被调用一次,而不是在每个循环上,所以我对此版本进行了修改,这是对吗?谢谢您的帮助。

function getCount(content) {
  var deferred = $q.defer();
  db.transaction(function(tx){
    tx.executeSql(
      query,
      [data],
      function(tx, res) {
        var count = res.rows.item(0).cnt;
        if (count === 0) {
          var commit = content.commit;
          var status = true;
          commit.forEach(function(entry) {
            tx.executeSql(
              query,
              [data],
              function(tx, res){},
              function (e) {
                status = false;
              }
            );
          });
          // here is right?
          if (status) {
            deferred.resolve(res);
          }
          else {
            deferred.reject();
          }
        }
        else{
          deferred.resolve(res);
        }
      },
      function (e) {
        deferred.reject(e);
      }
    );
  });
}

------------编辑------------------------

检查每个循环

function getCount(content) {
  var deferred = $q.defer();
  db.transaction(function(tx){
    tx.executeSql(
      query,
      [data],
      function(tx, res) {
        var count = res.rows.item(0).cnt;
        if (count === 0) {
          var commit = content.commit;
          var commit_index = 0;
          commit.forEach(function(entry, index) {
            tx.executeSql(
              query,
              [data],
              function(tx, res){
                commit_index++;
              },
              function (e) {}
            );
            if (index === (commit.length - 1)) {
              if (commit_index === commit.length) {
                deferred.resolve(res);
              }
              else {
                deferred.reject(res);
              }
            }
          });
        }
        else{
          deferred.resolve(res);
        }
      },
      function (e) {
        deferred.reject(e);
      }
    );
  });
}

是的解决方案和拒绝应被调用一次,而foreach循环是循环的Aync形式。所以你无法检查

 ` if (status) {
   deferred.resolve(res);
   }
   else {
    deferred.reject();
   }`

因此,您必须在每个循环中解决或拒绝,但是当上次迭代到来时。当提交长度等于索引条目时,您可以在每个循环中检查最后一个迭代。

最新更新