使用 promise 调用函数的 for 循环只工作一次

For loop that calls a function with a promise works just once

我正在尝试获取 timbre.js 记录功能来创建多个缓冲区并将它们存储在一个对象中。创建录音并将其存储在 'songs' 对象中的函数在这里:

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);
}

但是我只将一条测试消息记录到控制台,因此循环似乎 运行ning 一次然后停止。我试过将代码的 'then()' 向前部分移动到 for 循环本身内部(即 generateSongTitle().then(...) ),但这有同样的问题。如何多次使 generateSong() 函数达到 运行?

谢谢

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

您没有返回 output.send

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

这将使承诺链上的下一个处理程序能够实际获得 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 首歌曲...理论上!告诉我它是否有效:)