for循环调用带有promise的函数只能工作一次

时间:2015-03-25 14:09:21

标签: javascript promise audio-recording web-audio

我正在尝试使用timbre.js记录功能​​来创建多个缓冲区并将它们存储在一个对象中。创建录音并将其存储在歌曲中的功能'对象在这里:

var generateSong = function(songtitle){
    T.rec(function(output) {
        //... composition here, full at: http://mohayonao.github.io/timbre.js/RecordingMode.html
        output.send(synth);
    }).then(function(buffer) {
        var songobject = {}
        var song = T("buffer", {buffer:buffer});
        songobject['song'] = song;
        songobject['buffer'] = buffer.buffer[0];
        songobject['samplerate'] = buffer.samplerate;
        songs[songtitle] = songobject;
        console.log('test message');
    });
};

然后我尝试用这样的for循环多次调用它:

for(var i=0;i<5;i++){
    var songtitle = generateSongTitle();
    var songobject = generateSong(songtitle);
}

但是我只是将一条测试消息记录到控制台,因此循环似乎正在运行一次然后停止。我已经尝试过移动&#39;然后()&#39;将部分代码转发到for循环本身(即generateSongTitle()。then(...)),但这有同样的问题。如何让generateSong()函数多次运行?

谢谢

1 个答案:

答案 0 :(得分:0)

所以,我猜实际上有两个可能的问题。

您没有返回output.send

的结果
T.rec(function(output) {
    //... composition here, full at: http://mohayonao.github.io/timbre.js/RecordingMode.html
    return output.send(synth);
}

这将使promise链上的下一个处理程序实际获得buffer值(如果它确实由send同步返回)。

T.rec可以并行运行吗?

你想同时录制5首歌曲 吗?

在录制下一首歌之前,您应该等待一首歌完成。

function generate() {
    var songtitle = generateSongTitle();
    var songobject = generateSong(songtitle);
    return songobject;
}

var nextSong = $.when(); // or any empty promise wrapper
for(var i=0;i<5;i++){
    nextSong = nextSong.then(generate);
}

理论上这将顺序生成5首歌曲!请告诉我它是否有效:)