Node.js使用setTimeout()暂停和恢复流

时间:2016-10-03 18:24:03

标签: javascript node.js settimeout node.js-stream

我正在使用Node.js(v4.4.7)并写了几行来播放声音......

const Speaker = require('audio-speaker/stream');
const Generator = require('audio-generator/stream');

const speaker = new Speaker({
        channels: 1,          // 1 channel 
        bitDepth: 16,         // 16-bit samples 
        sampleRate: 44100     // 44,100 Hz sample rate 
      });

// Streams sample values...
const sound = new Generator(
        //Generator function, returns sample values
        function (time) {
               return Math.sin(Math.PI * 2 * time * 2000);
        },
        {
        //Duration of generated stream, in seconds, after which stream will end. 
        duration: Infinity,

        //Periodicity of the time. 
        period: Infinity
       });

// Pipe value stream to speaker
sound.pipe(speaker);

......欢呼,它有效!现在,让我们尝试暂停声音并在3秒后恢复......

sound.pause();

setTimeout(()=>{
        sound.resume();
        console.log(sound.isPaused());   //  => false
}, 3000);

......很棒,这也很有效!现在,让我们尝试相反的做法并在3秒后暂停声音...

setTimeout(()=>{
        sound.pause();
        console.log(sound.isPaused()); // => true / although sound is still playing 
}, 3000);

......等等,为什么这不起作用?为什么sound.isPaused()显示“true”,尽管声音仍在播放。是错误还是我做错了什么?

我浏览了Node.js文档和一些关于Node.js中的流的教程,但是找不到解释。在本教程中,他们只使用setTimout()来恢复流,但是他们从来没有说过为什么你这么说不能以这种方式暂停流。

1 个答案:

答案 0 :(得分:2)

目前,我不知道为什么在可读流上调用.pause()/。resume()不能按预期工作。我最终在可写流上调用了.cork()/。uncork(),从而实现了预期的结果。

setTimeout(()=>{
    speaker.cork();
}, 3000);

setTimeout(()=>{
    speaker.uncork();
}, 3000);

我会在得到此行为的解释后立即更新此答案。