1

したがって、同期 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);
};

sleepJavascript では実際のものではないため、機能しないソリューション:

var myCoolAbstraction = function(sql) {
    var res;
    doWebSQLThing(sql, function(d) {
        res = d;
    });
    while (res === undefined) {
        sleep(100);
    }
    return res
};

上記の最初のコード ブロックのコードの動作または内容を変更するソリューションは失敗します。

編集: これは実行できないと思われ、このデモの他のオプションを検討していますが、誰かが解決策を持っているかどうか知りたい.

4

1 に答える 1

1

WebSQL は非同期 API です。実行から完了までの実行モデルに依存しているため、非同期関数を同期関数に変換することはできません。これは、現在の実行スタックが完了した後にのみコールバック関数が呼び出されることを意味します。

ただし、中断された実行コンテキストを許可する新しい ecmascript 標準のジェネレーターがあります。実行は、yield ステートメントごとに一時停止します。次のように、その機能を使用して、データベース要求が非同期である間に線形ワークフローを作成できます。

var db = new ydn.db.Storage(db_name, schema);
db.spawn(function* (tdb) {
  var value_1 = yield tdb.get('st', key_1);
  value_1.amount += 10;
  var key_1 = yield tdb.put('st', value_1);
  var value = yield tdb.get('st', key_1);
  console.log(value);
};, ['st'], 'readwrite'));

この単体テストは、夜間の Firefox と、ハーモニー フラグをオンにした Chrome でテストできます。

于 2013-11-05T01:42:19.830 に答える