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我现在不知道。我的猜测是,你正在压倒服务器。目前,您的所有请求都是同时发送的,因此服务器可能会在几张图像后阻止您。也许考虑一下只运行少量并行请求。