【发布时间】:2011-12-06 08:02:43
【问题描述】:
我有一个标准的 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's deferred Object,我认为这段代码还有改进的余地。不幸的是,我对它还不是很舒服,我正在努力学习它。
所以我的问题是是否可以调整我的幼稚代码并利用这个新 API,如果可以,您能否提供一些建议?
这是一个 jsfiddle 我的实现。
【问题讨论】:
-
+1 总是很高兴看到顶级回答者提出一个好问题。自己回答这个?
标签: javascript jquery jquery-deferred