【发布时间】:2018-09-28 23:47:21
【问题描述】:
我在下面有以下代码的 sn-p。它目前有效,但我希望对其进行一些优化/重构。
基本上,它会获取 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 循环被阻塞了。
【问题讨论】:
标签: javascript node.js asynchronous promise refactoring