Asynchronous for cycle in JavaScript

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

    http://cuzztuts.blogspot.ro/2011/12/js-async-for-very-cool.html

    EDIT:

    link from github: https://github.com/cuzzea/lib_repo/blob/master/cuzzea/js/functions/core/async_for.js

    function async_for_each(object,settings){
    var l=object.length;
        settings.limit = settings.limit || Math.round(l/100);
        settings.start = settings.start || 0;
        settings.timeout = settings.timeout || 1;
        for(var i=settings.start;i=settings.limit){
                setTimeout(function(){
                    settings.start = i;
                    async_for_each(object,settings)
                },settings.timeout);
                settings.limit_callback ? settings.limit_callback(i,l) : null;
                return false;
            }else{
                settings.cbk ? settings.cbk(i,object[i]) : null;
            }
        }
        settings.end_cbk?settings.end_cbk():null;
        return true;
    }
    

    This function allows you to to create a percent break in the for loop using settings.limit. The limit property is just a integer, but when set as array.length * 0.1, this will make the settings.limit_callback to be called every 10%.

    /*
     * params:
     *  object:         the array to parse
     *  settings_object:
     *      cbk:            function to call whenwhen object is found in array
     *                          params: i,object[i]
     *      limit_calback:  function to call when limit is reached
     *                          params: i, object_length
     *      end_cbk:        function to call when loop is finished
     *                          params: none
     *      limit:          number of iteration before breacking the for loop
     *                          default: object.length/100
     *      timeout:        time until start of the for loop(ms)
     *                          default: 1
     *      start:          the index from where to start the for loop
     *                          default: 0
     */
    

    exemple:

    var a = [];
    a.length = 1000;
    async_for_each(a,{
        limit_callback:function(i,l){console.log("loading %s/%s - %s%",i,l,Math.round(i*100/l))}
    });
    

提交回复
热议问题