0
我有一個人員列表,每個列表包含一個圖像URL列表。
我需要下載每個URL,然後計算該圖像的'簽名',驗證它是否唯一,然後將其保存到文件系統。
我目前的做法是:兩個嵌套async.each
調用,和一個async.waterfall
檢查並保存圖像(爲簡單起見,省略錯誤處理):var async = require('async'); var request = require('request');node.js:將異步函數列表應用於列表中的每個項目
var syncPersonsImages = function(persons, images, callback) {
async.each(
persons,
function(person, callbackPerson) {
async.each(
person.imageUrls,
function(imageUrl, callbackImage) {
download(imageUrl, function(err, image) {
downloadPost(callbackImage);
});
},
function(err) {
callbackPerson();
}
);
},
function(err) {
callback(null, persons);
}
);
function download() {
request(
{ uri: image.url },
function(err) {
callback(err, image);
},
function(contents, res) {
image.contents = res.contents;
callback(null, image);
}
);
}
function downloadPost(image, callback) {
async.waterfall(
[
getSignatureFromImage,
findSimilarSignatureImage,
saveImage,
],
function (err, image) {
callback(image);
}
);
}
function getSignatureFromImage(image, callback) {
image.signature = crypto.createHash('md5').update(image.url).digest('hex');
callback(null, image);
}
function findSimilarSignatureImage(image, callback) {
if (existsAlready(image.signature)) { // this function is not shown but it's behaviour is clear...
image.isNew = true;
}
callback(null);
}
function save(image, callback) {
if (image.isNew) {
img.save(function(err) {
console.log('image', image.url, 'saved');
callback(null, image);
}
} else {
callback(null, null);
}
}
};
的問題是syncPersonsImages
方法永遠不會終止...
什麼建議嗎?
我的方法至少是否正確?
哪裏定義了'download'? –
@Mike Atkins:是的,對不起,忘了它...但代碼的目的是作爲'僞代碼',而不是真正的代碼...然而,你是對的...我要完全重寫這個問題與真實的工作代碼......我更感興趣的是瞭解所提交的流程是非常正確的...... – MarcoS