我想获得以下工作流程:
- 获取一些图片的URL
- 将这些URL传递给另一个方法进行下载,并返回下载的路径
- 使用这些路径获取图像并使用pdfkit创建PDF文件
经过大量修改,我的代码看起来像这样-
nightmare
.goto(url)
.wait('body')
.evaluate( ()=>document.querySelector('body').innerHTML)
.end()
.then((response) => {
return getJSONData(response);
})
.then((data) => {
return processJSONData(data);
})
.then((pages) => {
return createFile(pages);
})
.catch(err => {
console.log(err);
});
getJSONData(data)
使用cheerio解析HTML,processJSONData(data)
使用图像下载器下载图像。根据我的理解,由于这是一个承诺链,这意味着每个then((内部的执行将是异步的,但then(((块本身将按顺序执行。在运行代码时,我发现即使前两个then((块是按顺序执行的(到目前为止(,createFile(pages)
块也会立即执行,从而创建一个损坏的PDF文件。这背后的原因可能是什么?如何确保then()
块同步执行,即每个then()
仅在前一个块被解析后运行
完整的代码可以在这里找到。
您不需要等待所有异步操作在processJSONData()
中完成,而只需要等待其中的某些部分。考虑更改如下:
function processJSONData(data){
// map() instead of forEach() to get a promise per request
const reqs = data.map(element => {
// return the inner promise chain to be collected
return download.image(element)
.then( ({filename}) => {
console.log("Saved to ",filename);
return filename;
});
});
// return a promise that waits for all of them to be finished
return Promise.all( reqs );
}