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