目前,我的代码加载所有图像异步。这也意味着在我当前的实现中,一旦完全下载了图像,就将其添加到fileArray中。由于并非所有图像的大小相同,因此每个图像的下载会在不同时间完成,从而导致图像以随机顺序添加到数组中。
如何按照下载开始的顺序强制将图像添加到文件阵列?希望不会放弃异步的好处(所有图像同时下载)。
for (var i = 0; i < imageArray.length; i++) {
imageArray[i].download(function(err, contents) {
fileArray.push(base64_encode(contents));
console.log("SIZE: "+fileArray.length);
if (fileArray.length == 9) {
res.render("home", {keyArray: keyArray, titleArray: titleArray, usernameArray: usernameArray, imageArray: fileArray});
}
});
}
答案 0 :(得分:3)
您可以使用Promises
并将异步回调映射到Promise.all()
:
Promise.all(imageArray.map(function(image) {
return new Promise(function(resolve, reject) {
image.download(function(err, contents) {
if (err) {
reject(err);
} else {
resolve(base64_encode(contents));
}
});
});
})).then(function(fileArray) {
res.render("home", {keyArray: keyArray, titleArray: titleArray, usernameArray: usernameArray, imageArray: fileArray});
}).catch(function(err) {
// uh oh
});
奖金是你不需要检查数组大小来确认完成。