何度か、Firebaseを使用した同期関数と非同期関数で問題が発生しました。私の問題は、自分が作成した関数内で非同期のFirebase呼び出しを行う必要があることです。簡単な例として、オブジェクトの速度を計算して表示する必要があり、Firebaseに距離と時間が保存されているとします。
function calcVelocity() {
var distance, time, velocity;
firebaseRef.once('value', function(snapshot) {
distance = snapshot.val().distance;
time = snapshot.val().time;
velocity = distance / time;
});
return velocity;
}
$("#velocity").html(calcVelocity());
もちろん、上記のコードはfirebaseRef.once()
非同期呼び出しであるため機能しません。したがってvelocity
、に到達した時点ではまだ設定されていませんreturn velocity;
。return
コールバック関数の内部に配置する.on()
と、何も返されません。
1つの解決策は、calcVelocity()
関数を非同期にすることです。
別の解決策は、同期的に読み取られるがFirebaseから非同期に更新されるFirebaseのキャッシュバージョンを保存することです。
これらのソリューションの1つは他よりも優れていますか?そして、より良い解決策はありますか?