Asynchronous for cycle in JavaScript

前端 未结 13 1231
温柔的废话
温柔的废话 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:54

    Here's another example which I think is more readable than others, where you wrap your async function inside a function that takes in a done function, the current loop index, and the result (if any) of the previous async call:

    function (done, i, prevResult) {
       // perform async stuff
       // call "done(result)" in async callback 
       // or after promise resolves
    }
    

    Once done() is invoked, it triggers the next async call, again passing in the done function, current index and previous result. Once the entire loop is completed, the provided loop callback will be invoked.

    Here's a snippet you can run:

    asyncLoop({
      limit: 25,
      asyncLoopFunction: function(done, i, prevResult) {
        setTimeout(function() {
          console.log("Starting Iteration: ", i);
          console.log("Previous Result: ", prevResult);
          var result = i * 100;
          done(result);
        }, 1000);
      },
      initialArgs: 'Hello',
      callback: function(result) {
        console.log('All Done. Final result: ', result);
      }
    });
    
    function asyncLoop(obj) {
      var limit = obj.limit,
        asyncLoopFunction = obj.asyncLoopFunction,
        initialArgs = obj.initialArgs || {},
        callback = obj.callback,
        i = 0;
    
      function done(result) {
        i++;
        if (i < limit) {
          triggerAsync(result);
        } else {
          callback(result);
        }
      }
    
      function triggerAsync(prevResult) {
        asyncLoopFunction(done, i, prevResult);
      }
    
      triggerAsync(initialArgs); // init
    }

提交回复
热议问题