繁体   English   中英

将已链接诺言的结果添加到promise.all()中

[英]Add the result of a chained promise into promise.all()

我尝试构造一个名为downloadTextPromise的诺言,以downloadTextPromise文件,然后在Promise.all()中读取文件内容。 但是,我仍然无法读取Promise.all().then的文件内容。

我怀疑downloadTextPromise是一个两步承诺,因此只有第一步(HTTP GET)被推送到promises数组中。 但是我不知道如何解决它。

有什么提示吗? 任何可行的解决方案都是欢迎的,基于request-promise-native包不是强制性的。

我的代码如下:

const request = require("request-promise-native");
let promises = [];

//put several promises into promises array;
.....

let downloadTextPromise = request.get("http://example.com/xyz.txt").pipe(fs.createWriteStream(`~/xyz.txt`));

promises.push(downloadTextPromise);
Promise.all(promises).then(() => {
    //I need xyz.txt content at this stage, but it is not ready immediately.
}

首先,检查downloadTextPromise是否确实是一个承诺。 该库的文档没有提及pipe工作方式。 如果返回本地承诺,则可以执行console.log(downloadTextPromise instanceof Promise) 否则,您可以尝试console.log(!!downloadTextPromise.then)

如果这是一个承诺,则一种可能性是在流结束后同步解决该承诺。 实际写入文件的代码已添加到消息队列中。 在这种情况下,您可以通过以下方法解决此问题:

Promise.all(promises).then(() => {
    setTimeout(() => {
        // Do stuff with xyz.txt
    }, 0);
}

问题是writeStream部分,因此我应该构建一个返回正确承诺的函数。

我没有找到一种方法来构造一个从request.get().pipe()返回承诺的方法,而是使用如下的request.get().then()fs.writeFile()

但是,新解决方案中出现了另一个问题:此fs.writeFile可以很好地处理txt文件; 对于mp3或mp4,该函数不返回错误,但文件内容无效, Promise.all().then()Promise.all().then()进行进一步处理。

function downloadTextPromise() {
    return new Promise((resolve, reject) => {
        rp.get("http://example.com/xyz.txt").then(data => {
          fs.writeFile("./xyz.txt, data, err => {
            if (err) reject(err);
            resolve(true);
          });
        });
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM