【问题标题】:For loop that calls a function with a promise works just once使用 promise 调用函数的 for 循环只工作一次
【发布时间】:2015-05-29 06:20:42
【问题描述】:

我正在尝试获取 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);
}

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

谢谢

【问题讨论】:

  • 你的函数实际上没有返回任何东西 - 你能告诉我们 generateSongTitle 吗?
  • 您确定T.rec 确实可以并行工作吗?库可能会被编码以防止这种情况发生。

标签: javascript promise audio-recording web-audio-api


【解决方案1】:

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

你没有返回 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 首歌曲……理论上!请告诉我它是否有效:)

【讨论】:

  • 感谢您的回复,等一个完成再录制下一个确实解决了。干杯!
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 2014-07-25
  • 1970-01-01
  • 2017-09-12
  • 2016-01-09
  • 2021-06-04
  • 2011-09-16
相关资源
最近更新 更多