javascript - 关于 AngularJS 延迟解析位置

标签 javascript 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);
      }
    );
  });
}

最佳答案

是的,resolve和reject应该调用一次,fo​​rEach循环是aync形式的循环。所以你无法检查

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

所以你必须在每个循环中解决或拒绝,但当最后一次迭代到来时。当提交长度等于indexOf条目时,您可以检查每个循环中的最后一次迭代。

关于javascript - 关于 AngularJS 延迟解析位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30134346/

相关文章:

javascript - 为什么我的 event.currentTarget 会自动更改?

javascript - 将 jquery 变量传递给 codeigniter View

javascript - AngularJS Controller 中的单元测试 promise

Angularjs:动态创建的 Controller 加倍

javascript - 按字母顺序停止 AngularJS ng-repeat 渲染

javascript - 如何自动click()动态创建的元素

javascript - 增加/减少 url 路径名单击

循环内的 JavaScript 闭包 – 简单的实际示例

javascript - 如何使用 angular.js 获取 URI 组件

javascript - 如果 Div 上的条件为真,如何防止提交表单?