jQuery などの JavaScript ツールキットはすべてコールバック関数に関するものであり、これらのコールバックは匿名で定義されることがよくあります。例: 一部の Web ページでは、表にメッセージのリストが表示されます。このテーブルを更新するには、まずサーバーに現在のすべてのメッセージのリストを (ID として) 要求し、次に、まだ不明なメッセージ ID のコンテンツを取得します。
function fnUpdateMessages() {
$.ajax({
type: 'POST',
data: { action: 'get_message_ids' },
success: function(sData) {
var aMessageIds = sData.split(/,/);
var aUnknownIds = fnWhichIdsAreNotInTable(aMessageIds);
$.ajax({
type: 'POST',
data: {
action: 'get_message_contents',
ids: aUnknownIds.join(',')
},
success: function(oData) {
for (var id in oData.messages) {
fnInsertMessage(oData.messages[id]);
}
}
);
}
);
}
私がどこに行くか分かりますか?たった 2 回の AJAX 呼び出しの後、インデントがレベル 6 になるため、このコードは醜いです。もちろん、無名関数をファイル スコープで個別の関数に分割することもできますが、通常は名前空間を汚染し (これを別の無名関数呼び出しでラップしてさらに混乱させない限り)、これらの関数間の強い結合を壊します。単独では使用できません。これらは、元の関数の 2 番目と 3 番目の部分に似ていますfnUpdateMessages
。
私がもっと欲しいのは、次のようなものです:
function fnUpdateMessages() {
$.ajax({
type: 'POST',
data: { action: 'get_message_ids' },
success: continue(sData)
});
var aMessageIds = sData.split(/,/);
var aUnknownIds = fnWhichIdsAreNotInTable(aMessageIds);
$.ajax({
type: 'POST',
data: {
action: 'get_message_contents',
ids: aUnknownIds.join(',')
},
success: continue(oData)
);
for (var id in oData.messages) {
fnInsertMessage(oData.messages[id]);
}
}
continue(var1, var2, [...])
このスニペットは、外側の関数スコープに続くすべてのものを本体とする匿名のコールバック関数を定義する、新しい架空の構文を導入しています。これにより、これらのコールバック関数が同期コードのように見えます。これは標準の JS ではないため、明らかに前処理する必要があります。
このようなプリプロセッサの作成を検討する前に、このようなものが既に存在するかどうかを知りたいですか?
PS このアイデアが気に入ったら盗んでください。現時点では、さらに別のプロジェクトを実行する余裕はありません。コメント内のリポジトリへのリンクは、実際のコードに到達した場合に最適です。