user4573794
user4573794

Reputation: 53

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

I am trying to get the timbre.js recording function to create multiple buffers and store them in an object. The function that creates the recording and stores it in the 'songs' object is here:

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

Then I try and call this multiple times with a for loop like this:

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

However I am only getting one test message logged to the console, so the loop seems to be running once then stopping. I've tried moving the 'then()' onwards part of the code to inside the for loop itself (ie generateSongTitle().then(...) ), but that had the same problem. How can I get the generateSong() function to run multiple times?

Thank you

Upvotes: 1

Views: 96

Answers (1)

Guilherme Rodrigues
Guilherme Rodrigues

Reputation: 2854

So, I guess there's actually two possible problems there.

You are not returning the result of output.send

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

This will enable the next handler on the promise chain to actually get the buffer value (if it indeed is returned synchronously by send).

Can T.rec run in parallel?

Do you want to record 5 songs at the same time?

You should probably wait for one song to complete before recording the next.

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

This will generate 5 songs sequentially... in theory! Do tell me if it works :)

Upvotes: 1

Related Questions