これは私の最初の投稿ですが、今この解決策を非常に探しましたが、まだ答えが見つかりません。私は初心者の JavaScript 開発者だと思っているので、誰かが私が間違っていることを指摘してくれることを願っています。
HTML5を使用してiPhoneゲームに取り組んでいます。私がやりたいことは、ゲームで死ぬたびに、新しいスコアでデータベースを更新してから、新しいページ (スコア画面) にジャンプすることです。
update メソッドを呼び出すゲーム クラス (適切な言葉がないため「クラス」という言葉を使用)があり、トランザクションが完了したら (現在のページを閉じる) showScoreScreen 関数を呼び出すコールバックがあります。唯一の問題は、トランザクションが完了するまで十分に待たず、スコアが更新されないことです。
スコア画面にジャンプする前に 1 秒間待機するコードを追加すると、すべて正常に動作します。したがって、トランザクションが完了する前にコールバックが実装されているか、コールバックが正しく実装されていない可能性があります (ほとんどの場合)。ここで私が間違っていることを誰かが指摘できますか? SQLite を使用するのはこれが初めてですが、ドキュメントを何時間も調べた結果、正しいことをしているように思えます。
ご参考までに -
-finallyブロックの代わりに成功ハンドラーにコールバックを実装しようとしましたが、同じ問題が発生します。
-「self」をupdateScoreに渡す理由は、 setInterval関数内で新しいコンテキストに変更されるためです。
-このスレッドで同様の問題を見つけましたが、本当の答えはありません -トランザクションが終了する前に SQLite 成功コールバックが発生する
///////////////////////// GAME CLASS ///////////////////////////////////
endLevel: function(){
var self = this;
self.setGameOver(true);
// Wait until death animation has played
var wait = setInterval(function() {
if(self.canEndLevel){
var score = self.getScore();
self.updateScore(self);
clearInterval(wait);
}
}, 200);
},
updateScore: function(self){
//TODO: Get score and determine if higher
self.dbConnection.updateScore(self.showScoreScreen);
},
showScoreScreen: function(){
window.location.href='./score.html?level=' + window.levelNo + '&score=' + 'S'
},
/////////////////////////////////////////////////////////////////
///////////////////// DBConnection Class //////////////////////////
updateScore: function(callback){
var sucessHandler = this.sucessHandler;
var errorHandler = this.errorHandler;
try{
this.db.transaction(
function (transaction) {
transaction.executeSql('update score set grade = "JAME444" where levelId = 1', [], sucessHandler, errorHandler);
}
);
}
catch(e){}
finally {
callback();
}
},
.
.
////////////////////////////////////////////////////////////