1

これは概念的な質問です。

WebOS で発生する操作の多くは非同期です。私は以前に Ajax プログラミングを行ったことがありますが、webOS がそれを新しいレベルに引き上げているように感じます。Web からニュース記事のリストを取得し、記事を HTML5 ストレージ データベースにローカルにキャッシュするアプリケーションの例を次に示します。

function FirstAssistant() {
}

FirstAssistant.prototype.setup = function() {
    this.controller.setupWidget('articleList',
        this.attributes = { itemTemplate: "article" },
        this.model = {}
    );

    this.db = openDatabase("FooArticles", "1.0");
};

FirstAssistant.prototype.activate = function() {
    this.db.transaction(function(transaction){
        transaction.executeSql(
            "CREATE TABLE IF NOT EXISTS 'articles' (name TEXT, favorite INTEGER DEFAULT 0)",
            [], this.successHandler.bind(this), this.errorHandler.bind(this)
        );
    });

   this.fetchArticles();
};

FirstAssistant.prototype.successHandler = function(transaction, results) {
    // SELECT from 'articles' to populate this.model
};

FirstAssistant.prototype.errorHandler = function(transaction, results) {
    // whatever
};

FirstAssistant.prototype.fetchArticles = function() {
    var request = new Ajax.Request(url, {
        method: 'get',
        onSuccess: this.fetchArticlesSuccess.bind(this),
        onError: this.fetchArticlesError.bind(this)
    });
};

FirstAssistant.prototype.fetchArticlesSuccess = function(request) {
    // populate this.model with new articles
};

FirstAssistant.prototype.fetchArticlesError = function(request) {
    // whatever
};

したがって、すべてが非同期であるため、Web から新しい記事を取得しながら、データベースを作成してキャッシュされた記事を読み取ろうとしています。すべてがコールバックを介して行われるため、最初に何が起こるかについては確信が持てません。データベースはどの記事が「お気に入り」としてマークされているかを認識していますが、実行速度によっては、this.model が空 (db コールバックが最初に実行されるため) であったり、アイテムが含まれている場合があります (AJAX が最初に返されるため)。そのため、各コールバックは、リストに入力するか、リストを反復して更新できる必要があります。

私の現在のプロジェクトは、別のコールバックとモデルをミックスに追加して FilterList を使用しているため、別の複雑なレイヤーを追加します。

これを質問に要約するには:

  1. JavaScript は非同期ですが、実行スレッドは 1 つだけですか? this.model を同時に編集する 2 つの関数について心配する必要はありますか?
  2. 相互に依存する非同期操作を処理する一般的な方法は何ですか? (つまり、2 つのソースでモデルのデータが重複する可能性がある this.model での重複を防止します)
4

2 に答える 2

2

私自身の質問への答えとして、Mojo.Function.Synchronizeが表示されます。

このクラスのインスタンスは、一連のコールバック関数がすべて同時に呼び出されるようにするために使用されます。作成後、wrap()メソッドを使用して、同期するコールバックをラップしてから、非同期サービスに渡します。同期オブジェクトは、返されたすべてのラッパーが呼び出されるまで、それらのいずれかの呼び出しを延期します。

于 2010-02-02T11:58:09.013 に答える
1

最近のブラウザーや JS エンジンに追加されたワーカー スレッドを明示的に使用しない限り、Javascript コールバックは同時に実行されません。

一般的な手法の 1 つは、一連のフラグを使用することです。操作が 5 つの処理に依存する場合、フラグを 5 に設定し、項目が完了するたびにフラグを 1 ずつ減らし、それぞれの処理でフラグが 0 かどうかを確認します。その場合は、収集されたすべてのデータでアクションを実行するファイナライズ メソッドを実行します。

于 2010-02-01T21:02:46.293 に答える