如何使WebSQL查询同步?

use*_*890 8 javascript sqlite asynchronous synchronous web-sql

考虑:

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

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

CL.*_*CL. 6

无论您想要多少,异步回调都不是同步的.

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

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);

  });
}
Run Code Online (Sandbox Code Playgroud)

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


cil*_*ilf 5

如今,您可以利用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
      );
    });
  });
}
Run Code Online (Sandbox Code Playgroud)