これは概念的な質問です。
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 を使用しているため、別の複雑なレイヤーを追加します。
これを質問に要約するには:
- JavaScript は非同期ですが、実行スレッドは 1 つだけですか? this.model を同時に編集する 2 つの関数について心配する必要はありますか?
- 相互に依存する非同期操作を処理する一般的な方法は何ですか? (つまり、2 つのソースでモデルのデータが重複する可能性がある this.model での重複を防止します)