为什么node.js承诺即使放在then()块中也不会解析



我想获得以下工作流程:

  • 获取一些图片的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 );
}

最新更新