zoukankan      html  css  js  c++  java
  • JavaScript 异步操作

    
    

    串行执行

    var items = [];
    for (var i=0;i<10000;i++){
        items[i]=i+1;
    }
    console.log(items);
    var results = [];
    
    function async(arg, callback) {
        console.log('参数为 ' + arg +' , 1秒后返回结果');
        setTimeout(function () { callback(arg * 2); }, 1000);
    }
    
    function final(value) {
        console.log('完成: ', value);
    }
    
    function series(item) {
        console.log(item)
        if(item) {
            async( item, function(result) {
                results.push(result);
                return series(items.shift());
            });
        } else {
            return final(results[results.length - 1]);
        }
    }
    
    series(items.shift());



    并行执行

    var items = [];
    for (var i=0;i<10000;i++){
        items[i]=i;
    }
    var results = [];
    
    function async(arg, callback) {
        console.log('参数为 ' + arg +' , 1秒后返回结果');
        setTimeout(function () { callback(arg * 2); }, 1000);
    }
    
    function final(value) {
        console.log('完成: ', value);
    }
    
    items.forEach(function(item) {
        async(item, function(result){
            results.push(result);
            if(results.length === items.length) {
                final(results[results.length - 1]);
            }
        })
    });

    并行与串行的结合

    <div id="app"></div>
    var items = [];
    for (var i=0;i<1000;i++){
        items[i] = i;
    }
    var results = [];
    var running = 0;
    var limit = 100;
    
    function async(arg, callback) {
        console.log('参数为 ' + arg +' , 1秒后返回结果');
        $("#app").append('<div>参数为 '+ arg +' , 1秒后返回结果</div>')
        window.scrollTo(0,document.body.scrollHeight);
        setTimeout(function () { callback(arg * 2); }, 3000);
    }
    
    function final(value) {
        console.log('完成: ', value);
        $("#app").append('<div>完成 '+ value.toString() +'</div>')
    }
    
    function launcher() {
        while(running < limit && items.length > 0) {
            var item = items.shift();
            async(item, function(result) {
                results.push(result);
                running--;
                if(items.length > 0) {
                    launcher();
                } else if(running == 0) {
                    final(results);
                }
            });
            running++;
        }
        console.log("当前执行任务数量:"+running+" 剩余任务数量:"+items.length);
    }
    launcher();
  • 相关阅读:
    fetch API 和 ajax
    java 通过数据库名获得 该数据所有的表名以及字段名、字段类型
    自定义注解,通过反射获得注解中的值(详细自定义注解解释)
    main方法中sleep
    eclipse中设置JVM内存
    命令java 找不到或无法加载主类
    windows下的命令
    mac terminal基本命令
    ThreadLocal 源码剖析
    SQL中的函数用法
  • 原文地址:https://www.cnblogs.com/chenwh/p/9848454.html
Copyright © 2011-2022 走看看