如何使 WebSQL 查询同步?

新手上路,请多包涵

考虑:

 var globalvar;

function viewyearmain() {
  db.transaction(function (tx)
  {
    tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results)
    {
       var len = results.rows.length;
       msg = len;
       globalvar = msg;
    }, null);

  });

  if (globalvar>0)
  {
    alert("ROWS FOUND");
  }
  else
  {
    alert("ROWS NOT FOUND");
  }
}

问题是 ROWS NOT FOUND 出现,因为在到达 if 语句时事务尚未完成。

原文由 user2058890 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 354
2 个回答

异步回调不是同步的,不管你想要多少。

只需将 所有 依赖于结果的代码移动到回调中:

 var globalvar;

function viewyearmain() {
  db.transaction(function (tx)
  {
    tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results)
    {
       var len = results.rows.length;
       msg = len;
       globalvar = msg;
       if (globalvar>0)
       {
         alert("ROWS FOUND");
       }
       else
       {
         alert("ROWS NOT FOUND");
       }
    }, null);

  });
}

或者,将其移动到第二个函数中,并从回调中调用它。

原文由 CL. 发布,翻译遵循 CC BY-SA 3.0 许可协议

如今,您可以利用 async / await 并做出如下承诺:

 async function alertResult() {
  const rows = await viewyearmain();
  if (rows.length) {
    alert("ROWS FOUND");
  } else {
    alert("ROWS NOT FOUND");
  }
}

function viewyearmain() {
  return new Promise(resolve => {
    db.transaction(function(tx) {
      tx.executeSql(
        "SELECT * FROM BUDGET WHERE holdingtype = ?;", ["month"],
        function(tx, result) { resolve(result.rows); },
        null
      );
    });
  });
}

原文由 cilf 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题