Search code examples
javascriptangularjs

Best way to wait for .forEach() to complete


Sometimes I need to wait for a .forEach() method to finish, mostly on 'loader' functions. This is the way I do that:

$q.when(array.forEach(function(item){ 
    //iterate on something 
})).then(function(){ 
    //continue with processing 
});

I can't help but feel that this isn't the best way to wait for a .forEach() to finish. What is the best way to do this?


Solution

  • If there is no asynchronous code inside the forEach, forEach is not asynchronous, for example in this code:

    array.forEach(function(item){ 
        //iterate on something 
    });
    alert("Foreach DONE !");
    

    you will see the alert after forEach finished.

    Otherwise (You have something asynchronous inside), you can wrap the forEach loop in a Promise:

    var bar = new Promise((resolve, reject) => {
        foo.forEach((value, index, array) => {
            console.log(value);
            if (index === array.length -1) resolve();
        });
    });
    
    bar.then(() => {
        console.log('All done!');
    });
    

    Credit: @rolando-benjamin-vaz-ferreira