我有一個標準的JavaScript對象,其原型被擴展爲.start()
方法,以2個回調爲參數:success
和failure
。此方法執行一些異步處理(它是而不是 AJAX),並根據此處理的結果調用成功或失敗回調。如何使用jQuery的延期對象與自定義javascript對象?
下面是如何這可能是系統化:
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);
}
這不是很重要的方法內部進行準確的處理,只知道它是異步非阻塞的。當啓動方法完成處理時,我無法控制時間點。我也無法控制這種方法的原型和實現。
我控制的是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's deferred Object。不幸的是,我對此感到不太舒服,我正在努力學習它。
所以我的問題是可以適應我的樸素代碼,並利用這個新的API,如果是的話,你能提供給我一些指針嗎?
這裏是一個jsfiddle與我的實施。
+1總是很好看頂回答者問一個很好的問題。自我回答這個? –