簡體   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