[英]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.