.start()
私は、プロトタイプが引数として2つのコールバックを取るメソッドで拡張された標準のjavascriptオブジェクトを持ってsuccess
います:failure
それぞれ。このメソッドは非同期処理 (AJAX ではありません) を実行し、この処理の結果に応じて、成功または失敗のコールバックを呼び出します。
これを図式化する方法は次のとおりです。
function MyObject() {
}
MyObject.prototype.start = function(successCallback, errorCallback) {
(function(s, e) {
window.setTimeout(function() {
if (Math.random() < 0.8) {
s();
} else {
e();
}
}, 2000);
})(successCallback, errorCallback);
}
メソッド内で実行される正確な処理はそれほど重要ではなく、非同期で非ブロッキングであることだけが重要です。start メソッドが処理を終了する時点を制御することはできません。また、このメソッドのプロトタイプと実装を制御することもできません。
私が制御できるのは、success
およびfailure
コールバックです。それらを提供するのは私次第です。
これで、これらのオブジェクトの配列ができました:
var arr = [ new MyObject(), new MyObject(), new MyObject() ];
この配列の要素の順序は重要です。配列の各要素でメソッドを連続してトリガーする必要がありますが.start()
、前の要素が完了した (つまり、成功のコールバックが呼び出された) 場合のみです。エラーが発生した場合 (失敗コールバックが呼び出された場合)、実行を停止し、配列の残りの要素に対して .start メソッドを呼び出さないようにします。
再帰関数を使用して、これを単純に実装できます。
function doProcessing(array, index) {
array[index++].start(function() {
console.log('finished processing the ' + index + ' element');
if (index < array.length) {
doProcessing(array, index);
}
}, function() {
console.log('some error ocurred');
});
}
doProcessing(arr, 0);
これは問題なく動作しますが、jQuery 1.5 で導入されたjQuery の deferred Objectを見ると、このコードには改善の余地があると思います。残念ながら、私はまだそれに慣れていません。私はそれを学ぼうとしています。
私の素朴なコードを適応させて、この新しい API を利用することは可能ですか?
これが私の実装のjsfiddleです。