1

私のアプリケーションは JavaScript webSQL を使用しており、コマンドの実行順序に問題があります。クエリ内のコードの順序に関係なく、最後に実行されます。たとえば、次のコードでは、2 が 1 の前に警告されます。

db.transaction(
        function (transaction) {
        transaction.executeSql(
        'SELECT * FROM contacts WHERE id = ?;',
        [id],
        function (transaction, result) {
           alert("1");
           if (result.rows.length != 0) {
            user = result.rows.item(0).name;
           } else {}
        },
        errorHandler);
    });

alert("2");
message = id + '%1E' + name;

なぜこれが起こるのでしょうか?

4

2 に答える 2

1

alert("2") をいつ行うか、トランザクションを終了していないため、渡した 2 番目の関数は呼び出されていません。successこれは私が想定しているハンドラーなので、トランザクションが正常に完了した後に呼び出されます。3 番目の引数は、クエリが失敗した場合にのみ実行するコード スニペットです。

ページが JavaScript を実行するのに十分なコンテンツをロードすると、イベント ハンドラー コードの外部にあるものはすべて実行されます。実行するためにページ全体をロードする必要はなくalert("2")、JS があれば十分であることに注意してください。これらのステートメントは非常に接近しているため、alert("2") ステートメントに到達して実行される前にトランザクションが完了する可能性は基本的にゼロです。

alert("2")ただし、と db.transaction(...)の間に十分なコードがある場合、 (いわゆる競合状態で) コールバックが alert(2) コードの前に実行される可能性があります。

この場合、成功ハンドラーが何をするかにもよりますが、イベント ハンドラーには注意が必要です。ページ DOM を変更する場合は、ページの読み込みにバインドされたイベント ハンドラーで db.transaction() と周囲のコードをラップすることを強くお勧めします。

于 2012-07-30T18:37:59.830 に答える
-1

これはあなたの質問に対する回答ではありませんが、webSQL について警告する必要があると思いました。

2010 年 11 月 18 日の時点で、W3C は Web SQL データベースの推奨草案を廃止し、今後維持しないことを発表しました。

したがって、現時点ではブラウザで動作する可能性がありますが、将来的には依存しません。

于 2012-07-30T18:37:42.717 に答える