gpt4 book ai didi

javascript - 重构复杂的嵌套 Node.js 函数

转载 作者:行者123 更新时间:2023-11-30 14:22:14 26 4
gpt4 key购买 nike

我在下面有以下代码片段。它目前有效,但我希望对其进行一些优化/重构。

基本上,它获取 JSON 数据,从响应中提取大量 PDF 的 URL,然后将这些 PDF 下载到一个文件夹中。

我希望重构此代码以便在 PDF 全部下载后对其进行处理。目前,我不确定该怎么做。有很多嵌套的异步函数在进行。

我该如何重构它以允许我在我的错误处理程序之前添加另一个 .then 调用,以便我可以处理下载的 PDF?

const axios = require("axios");
const moment = require("moment");
const fs = require("fs");
const download = require("download");
const mkdirp = require("mkdirp"); // Makes nested files...
const getDirName = require("path").dirname; // Current directory name...

const today = moment().format("YYYY-MM-DD");

function writeFile(path, contents, cb){
mkdirp(getDirName(path), function(err){
if (err) return cb(err)
fs.writeFile(path, contents, cb)
})
};

axios.get(`http://federalregister.gov/api/v1/public-inspection-documents.json?conditions%5Bavailable_on%5D=${today}`)
.then((res) => {
res.data.results.forEach((item) => {
download(item.pdf_url).then((data) => {
writeFile(`${__dirname}/${today}/${item.pdf_file_name}`, data, (err) => {
if(err){
console.log(err);
} else {
console.log("FILE WRITTEN: ", item.pdf_file_name);
}
})
})
})
})
.catch((err) => {
console.log("COULD NOT DOWNLOAD FILES: \n", err);
})

感谢大家提供的任何帮助。

附言–– 当我现在简单地添加 .then 调用时,它会立即触发。这意味着我的 forEach 循环是非阻塞的?我认为 forEach 循环是阻塞的。

最佳答案

当前的forEach同步 运行,并且不会等待异步操作完成。您应该使用 .map 而不是 forEach,这样您就可以将每个项目从 download 映射到它的 Promise。然后,您可以在生成的数组上使用 Promise.all,一旦所有 download 完成,它将解析:

axios.get(`http://federalregister.gov/api/v1/public-inspection-documents.json?conditions%5Bavailable_on%5D=${today}`)
.then(processResults)
.catch((err) => {
console.log("COULD NOT DOWNLOAD FILES: \n", err);
});
function processResults(res) {
const downloadPromises = res.data.results.map((item) => (
download(item.pdf_url).then(data => new Promise((resolve, reject) => {
writeFile(`${__dirname}/${today}/${item.pdf_file_name}`, data, (err) => {
if(err) reject(err);
else resolve(console.log("FILE WRITTEN: ", item.pdf_file_name));
});
}))
));
return Promise.all(downloadPromises)
.then(() => {
console.log('all done');
});
}

如果您想在每次迭代时基本上阻止该函数,您可能需要结合使用 async 函数和 await

关于javascript - 重构复杂的嵌套 Node.js 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52563807/

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