如果您想使用 Deferreds/Promises 执行此操作,则可以执行以下操作:
$(function() {
function loadRow($imgs, timeout) {
var dfrd = $.Deferred(),
n = 0;
$imgs.each(function() {
this.onload = function() {
if(++n == $imgs.length) { dfrd.resolve(); }
}
this.src = "/path/to/img";
});
setTimeout(dfrd.resolve, timeout);//in case of slow network or img.onload failure
return dfrd.promise();
}
var $images = $(img.whatever),//adjust as required
rowlength = 5,//adjust as required
rowFilter = function(i) {
return function(index) {
return (index > i * rowlength) && (index < (i+1) * rowlength);
}
},
nRows = Math.ceil($images.length / rowlength);
timeout = 10000,//(ms) adjust as required
d = $.Deferred().resolve();
for(var i=0; i<nRows; i++) {
var $imgs = $images.filter(rowFilter(i));
d = d.then(loadRow($imgs, timeout));
}
});
未经测试
loadRow()
加载一行,并返回一个在该行加载或超时时解决的 Promise。
其余代码:
- 设置按行索引选择图像的方法。
- 建立一个种子延迟,立即解决以允许加载过程开始。
- 建立了几个其他的变量。
- 循环通过构建一个
.then()
链的行,该链在它进行时调用loadRow()
。
.then()
链是控制行加载顺序的机制。
该代码比其他答案中的代码更庞大,但它也为您做的更多,因为它包含一个超时机制。如果您有更简洁的方法来选择每行中的图像,它将简化。