gpt4 book ai didi

javascript - node.js:将异步函数列表应用于列表列表中的每个项目

转载 作者:行者123 更新时间:2023-12-03 08:12:09 25 4
gpt4 key购买 nike

我有一个人员列表,每个人都包含一个图像网址列表。
我需要下载每个网址,然后计算该图像的“签名”,验证它是否唯一,然后将其保存到文件系统。
我当前的方法是:两个嵌套的 async.each 调用和一个 async.waterfall 来检查和保存图像(为简单起见,省略错误处理):var async = require('async'); var request = require('request');

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 方法永远不会终止...
有什么建议吗?
我的方法至少理论上是正确的吗?

最佳答案

总的来说,我认为这种方法是合理的。有几点。我认为您不必要地包装了一些回调。例如,这个:

  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(person, callbackPerson) {
async.each(
person.imageUrls,
function(imageUrl, callbackImage) {
download(imageUrl, function(err, image) {
downloadPost(callbackImage);
});
}, callbackPerson);
}, callback);

...取决于您是否希望 async.each 调用在第一次出现错误时退出。

此外,您定义了不带参数的下载方法。

关于javascript - node.js:将异步函数列表应用于列表列表中的每个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34098874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com