【问题标题】:Trouble using async function to download Files in NodeJS (using pipe)使用异步函数在 NodeJS 中下载文件时遇到问题(使用管道)
【发布时间】:2021-03-23 16:50:52
【问题描述】:

开发者级别 - 初学者
最近开始编程。只熟悉 HTM/CSS/JS & NodeJS。
asyncPromises() 的情况下很难找到。

我正在使用这个↓代码在另一个async函数中自动下载文件。

如何以某种方式更改此代码,使其返回某些内容(可能是 Promise),
当我在另一个 async 函数中使用它时(使用 await ),它会等待它完成.
[换句话说 - 等待下载完成,然后再继续]

代码 - LINK TO CODE ON JSFIDLLE

// download function //
var downloadFile = async (uri, filename, callback) => {
    request.head(uri, function (err, res, body) {

        console.log('\n', 'Downloading File');
        request(uri)
            .on('error', error => { res.status(502).send(console.log(error.message)) })
            .pipe(fs.createWriteStream(`${filename}.mp4`))
            .on('finish', callback);
    });

    // return filename; //try and get relative path
};

【问题讨论】:

    标签: javascript node.js asynchronous async-await promise


    【解决方案1】:

    你这样写:

    var downloadFile = (uri, filename) => new Promise((resolve, reject) => {
        request.head(uri, (err, res, body) => {
            console.log('\n', 'Downloading File');
            request(uri)
                .on('error', error => {
                    res.status(502).send(error.message)
                    reject(error)
                })
                .pipe(fs.createWriteStream(`${filename}.mp4`))
                .on('finish', resolve);
        });
    })
    

    如果你使用 Promise,你不需要 callback 参数,因为它有自己的回调,resolvereject。你也不需要async,因为它只是将函数的返回值包装成promise的语法糖。

    【讨论】:

    • 非常感谢您的回复老兄,感谢您的时间。
    【解决方案2】:

    您想知道的答案是,对于 Node.js,使用 Node.js 和 Node.js 模块本身的“Streams”。当你尝试这样做时。

    解释什么是 Streams 的非常简短的版本是拆分某些内容(给您的文件)并将其发送到管道中以获取拆分内容的异步部分的方法,而不会阻塞任何内容或在通信中断的情况下丢失任何数据。

    所以这是了解"Streams" in Node.js的官方链接 这里是 API 文档:official Node.js Streams reference API

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-27
      • 2020-03-06
      • 2017-01-10
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多