したがって、同期 JavaScript API を使用する既存のかなり大きなアプリケーションがあります。この場合、Google Gears SQL. ギアをサポートしていないプラットフォーム (この場合は iOS) でアプリを動作させることが可能であることをクライアントにデモしようとしています。 localStorage. もちろん問題は、Web SQL が非同期で Gears SQL が同期であることです。歯車と対話するために使用している抽象化が既にあるので、その抽象化を変更して、代わりに Web SQL と対話するようにします。私はこのようなアプローチを使用してみました: http://jsfiddle.net/ZCD4u/同期動作を偽装しますが、Web SQL クエリはブロックされている間は実行されませんでした。また、ページ内でブロックされても SQL は実行されると考えて、すべての db を Web ワーカーに入れてみました。問題は、スリープ ループがまだブロックされている間、ワーカーからの返信を待っているリスナーが起動されないことです。私が必要としているのは、同期 API を使用する抽象化を変更して、独自の抽象化の API を変更せずに非同期 API を使用する方法です。つまり、抽象化が完了したときにコールバック メカニズムをアプリの残りの部分に公開する場合、失敗したことになります。より具体的には:
変更できないファイル:
var sql = 'SELECT things FROM tables';
var res = myCoolAbstraction(sql);
dothings(res);
Gears の代わりに Web SQL を使用できるように変更する必要があるファイル:
var myCoolAbstraction = function(sql) {
return doGearsThing(sql);
};
sleep
Javascript では実際のものではないため、機能しないソリューション:
var myCoolAbstraction = function(sql) {
var res;
doWebSQLThing(sql, function(d) {
res = d;
});
while (res === undefined) {
sleep(100);
}
return res
};
上記の最初のコード ブロックのコードの動作または内容を変更するソリューションは失敗します。
編集: これは実行できないと思われ、このデモの他のオプションを検討していますが、誰かが解決策を持っているかどうか知りたい.