$(function() {
$.when(Step1).then(function() {
$.when(Step2).then(Step3);
});
});
对于错误处理,我建议您将 Stepn 重写为:
function Stepn() {
return $.ajax(<foo>).fail(function() {
// handle failure
});
}
使用这种格式的回调可以让你做你想做的事。如果你有超过 5 个步骤,缩进就会变得一团糟,为此建立一个队列可能是值得的。
这是一个活生生的例子
var Queue = function() {
var q = [];
var that = this;
// If items in queue then run them.
function moveNext() {
if (q.length > 0) {
that.runItem();
}
}
// run first item in queue
this.runItem = function() {
// get item
var item = q.shift();
// when deferred object then run then ...
$.when(item.item).then([item.options.done, function() {
// item finished, move to next.
moveNext();
}], [item.options.fail, function() {
// if run item always then move next on failure.
if (item.options.always) {
moveNext();
}
}]);
};
this.add = function(def, options) {
// if array then call add on each item in array
if ($.isArray(def)) {
for (var d in def) {
this.add(d, options);
}
// return as we are done.
return this;
}
// push item onto array
q.push({
item: def,
options: options
});
// if items & not delay then run item.
if (q.length === 1 && !options.delay) {
this.runItem();
}
// enable jQuery style chaining \o/
return this;
};
};
Queue.add([def, def, ...], options)
将延迟项目或延迟项目数组添加到队列中。可以与单个延迟项或数组一起使用。选项图如下
{
"delay" : Boolean, // if true do not run the item in the queue after appending it.
"done" : Function, // optional done call back
"fail" : Function, // optional fail call back
"always": Boolean // if true run the next item in the queue even if this item fails.
}
Queue.runItem
,一个运行队列中下一个项目的函数。在内部调用,可以手动与延迟属性串联使用。