我有一个标准的 javascript 对象,它的原型扩展了一个.start()
方法,将 2 个回调作为参数: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 的延迟对象,我认为这段代码还有改进的空间。不幸的是,我对它还不是很舒服,我正在努力学习它。
所以我的问题是是否有可能调整我的幼稚代码并利用这个新的 API,如果是的话,你能给我一些建议吗?
这是我的实现的一个jsfiddle。