Asynchronous for cycle in JavaScript

前端 未结 13 1112
温柔的废话
温柔的废话 2020-11-22 11:37

I need a loop that waits for an async call before continuing. Something like:

for ( /* ... */ ) {

  someFunction(param1, praram2, function(result) {

    //         


        
13条回答
  •  忘了有多久
    2020-11-22 11:53

    You can't mix synchronous and asynchronous in JavaScript if you block the script, you block the Browser.

    You need to go the full event driven way here, luckily we can hide the ugly stuff away.

    EDIT: Updated the code.

    function asyncLoop(iterations, func, callback) {
        var index = 0;
        var done = false;
        var loop = {
            next: function() {
                if (done) {
                    return;
                }
    
                if (index < iterations) {
                    index++;
                    func(loop);
    
                } else {
                    done = true;
                    callback();
                }
            },
    
            iteration: function() {
                return index - 1;
            },
    
            break: function() {
                done = true;
                callback();
            }
        };
        loop.next();
        return loop;
    }
    

    This will provide us an asynchronous loop, you can of course modify it even further to take for example a function to check the loop condition etc.

    Now on to the test:

    function someFunction(a, b, callback) {
        console.log('Hey doing some stuff!');
        callback();
    }
    
    asyncLoop(10, function(loop) {
        someFunction(1, 2, function(result) {
    
            // log the iteration
            console.log(loop.iteration());
    
            // Okay, for cycle could continue
            loop.next();
        })},
        function(){console.log('cycle ended')}
    );
    

    And the output:

    Hey doing some stuff!
    0
    Hey doing some stuff!
    1
    Hey doing some stuff!
    2
    Hey doing some stuff!
    3
    Hey doing some stuff!
    4
    Hey doing some stuff!
    5
    Hey doing some stuff!
    6
    Hey doing some stuff!
    7
    Hey doing some stuff!
    8
    Hey doing some stuff!
    9
    cycle ended
    

提交回复
热议问题