首页 > 解决方案 > 开玩笑的打字稿请求进度管道未刷新

问题描述

我在 Jest 测试中从 request-progress 实现了这个功能。

var fs = require('fs');
var request = require('request');
var progress = require('request-progress');

async function downloader()
  Promise(resolve, reject) => { 
    // The options argument is optional so you can omit it
    progress(request('https://az412801.vo.msecnd.net/vhd/VMBuild_20141027/VirtualBox  /IE11/Windows/IE11.Win8.1.For.Windows.VirtualBox.zip'), {
    // throttle: 2000,                    // Throttle the progress event to 2000ms, defaults to 1000ms
    // delay: 1000,                       // Only start to emit after 1000ms delay, defaults to 0ms
    // lengthHeader: 'x-transfer-length'  // Length header to use, defaults to content-length
    })
    .on('progress', function (state) {
        console.log('progress', state);
    })
    .on('error', function (err) { 
        // Do something with err
    })
    .on('end', function () {
        // Do something after request finishes
    })
    .pipe(fs.createWriteStream('IE11.Win8.1.For.Windows.VirtualBox.zip'));
  }
)

但是,管道在传输结束时不会被冲洗。当测试在“等待”后退出时,下载的文件大约为 1k 左右,小于正确的文件大小。所以我必须假设一个丢失的同花顺。

如果我在下载后运行一组更复杂的函数,那么文件的大小是正确的。这就是我启发式地将问题确定为丢失冲洗的方式。

有没有办法在 on('end' ... ) 或其他方法中强制刷新文件流?

或者,我可以添加一个等待,但它很老套,我不喜欢它。

如果我将解决方案放在 .on('end') 中,我不会得到最后一次冲洗。

如果我不包含解析,则该函数将永远不会返回。

可以放在管子上吗?

标签: typescriptjestjs

解决方案


我不得不承认 Jest / Node 框架对我来说是新的。但是经过一些迭代后起作用的是

.pipe(fs.createWriteStream(fname).on('finish', () => {resolve();}));


推荐阅读