Javascript 为什么node.js即使放入then()块也无法解析?
我想获得以下工作流:Javascript 为什么node.js即使放入then()块也无法解析?,javascript,node.js,asynchronous,promise,async-await,Javascript,Node.js,Asynchronous,Promise,Async Await,我想获得以下工作流: 获取一些图像的URL 将这些URL传递给另一个方法以下载它们,并返回下载的路径 使用这些路径获取图像并使用创建PDF文件 经过大量的修改,我的代码如下所示- nightmare .goto(url) .wait('body') .evaluate( ()=>document.querySelector('body').innerHTML) .end() .then((response) => {
- 获取一些图像的URL
- 将这些URL传递给另一个方法以下载它们,并返回下载的路径
- 使用这些路径获取图像并使用创建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(数据)
用于解析HTML,而processJSONData(数据)
用于下载图像。根据我的理解,因为这是一个承诺链,这意味着每个then()中的执行都是异步的,但是then()块本身将按顺序执行。在运行代码时,我发现即使前两个then()块是按顺序执行的(到目前为止),createFile(pages)
块也会立即执行,从而创建一个损坏的PDF文件。这背后的原因可能是什么?如何确保同步执行then()
块,即每个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 );
}
您的processJSONData()
正在执行异步操作,但不会等待结果。您只等待forEach()
中的部分结果,而不是所有结果都完成。我如何等待它们完成?有什么想法吗?看来你并不是在回馈别人的承诺processJSONData@badsyntax请查看processJSONData
中的注释块。即使我返回了promises
变量,它也会立即返回一个promise对象,并且仍然会创建一个损坏的PDF。谢谢@Sirko,这个答案消除了很多疑问。我一直在返回reqs
而不是Promise.all(reqs)
这就是问题所在。不过,还有一个问题,有没有可能解释为什么有时候下载会挂在一些特定的图像上?有没有办法强制解决这个问题?我使用过,但即使这样,过程也不会结束,如果倒计时太小,会立即结束。@srdg我现在不知道。我的猜测是,你正在压倒服务器。目前,您的所有请求都是同时发送的,因此服务器可能会在几张图像后阻止您。也许考虑一下只运行少量并行请求。