属于流程控制问题。
可以借鉴很多 Flow Control 的库类来协助完成该功能。例如 wind.js, async 等。
使用这些的好处是可以更方便地处理异常。楼上的递归方法很好的解决了问题,但是如果出现异常,就不方便处理了。
花了几分钟自己裸写了一个,供参考。推荐去学习 wind.js , async 的实现(我还没看过 -_- )。
这个的优点是统一异常的处理。代码的层级可能会少一些。
var series = function (arr, iterator, callback) {
var queues = [];
var next = function (err) {
if (err) {
callback(err);
return;
}
if(queues.length == 0) {
callback();
return;
}
queues.shift()(next);
};
var curry = function (func) {
var args = [].slice.call(arguments);
args.shift();
return function () {
args.concat([].slice.call(arguments));
func.apply(func, args);
}
};
for (var i = 0, n = arr.length; i < n; i++) {
queues.push(curry(iterator, arr[i]));
}
next();
};
var urls = [];
for (var i = 1; i < n; i++) {
urls.push("http://xxx/" + i)
}
series(urls, function(url, next) {
$.get(url, function(data) {
// 随便做啥
if(success) {
// 如果没有任何问题
next(null)
} else {
// 如果发生了某些错误
var err = new Error();
next(err);
}
})
}, function(err) {
if(err) {
// 处理异常
}
});