2011-08-08 7 views
1

私がしようとしているに値割り当てながら:問題のFirefox 5.0で、次のJavaScript変数

var db; 
var request = mozIndexedDB.open("MyTestDatabase"); 
request.onerror = function(event) { 
    alert("Why didn't you allow my web app to use IndexedDB?!"); 
}; 
request.onsuccess = function(event) { 
    db = request.result; 
    //db = event.target.result; //also tried this 
    console.log(db); //get the object 
}; 

console.log(db); //undefined 

私が欲しいデシベル、ハンドラの外側からアクセスを。ここの問題は何ですか? thisから何かを学ぼうとしています。

(すなわちrequest.result)その要求は、結果変数そのものを設定しないであろうと思われる。..

答えて

3

:ハンドラがこれを行うとき、特に、それが呼び出されていない、非同期的に呼び出されるとされることを

request.onsuccess = function(event) { 
    db = request.result; 
    //db = event.target.result; //also tried this 
    console.log(db); //get the object 
}; 

console.log(db); //undefined 

となるので、var db;から得られるdbの初期値になります。

コールバック以外でdbにアクセスできますが、必要なときに必ずしも有用な価値を持っているとは限りません。通常の方法は、成功ハンドラ内にdbが必要なものにコールをかけることです。別の場所でdbを使用する必要がある場合は、使用前に定義されているかどうかをチェックし、使用する前にそれを確認する必要があります。

、あなたのアプリケーションを続行する前に準備ができてdbを待つ必要があれば、このような何かが動作するはずです:

var timer = setInterval(function() { 
    if(!db) // Not ready yet. 
     return; 
    // We have a db so we can stop waiting 
    clearInterval(timer); 
    // and get on with our real work. 
    start_main_application(); 
}, 100); 

setIntervalは、すべての0.1秒をトリガーとdbがまだあるかどうかを確認します。そうでない場合は、間隔が次回にトリガーされるまで何もしません。 dbがある場合はshuts down the timerとなり、メインアプリケーションが起動します。

+0

ハンドラが関数を実行したかどうかを確認する方法は? – Vikas

+0

次の実行のために待機ループを作成できますか? – Vikas

+0

@Vikas:更新情報をご覧ください。 –

0

私が行方不明です単純なことがなければなりません。

関数(イベント)のパラメータに 'result'値が含まれている可能性があります。

あなた db変数が成功ハンドラ内で値が割り当てられ
1
console.log(db); //undefined 

確かに、それは不明ですが、それは正しい動作です。

何が起きているのかを確認してください。リクエストを処理していて、そのリクエストを処理するハンドラを送信しています(onsuccess)。初期化はハンドラ本体で行われていますが、イベントはまだ発生していません!コードフローはconsole.log(db)に行きます。ハンドラがまだ呼び出されていないので、dbはそこで初期化されていません。

onsuccessが発生するとすぐに、handlerが呼び出され、dbが初期化されます。その後、それを使うことができます。