• JavaScript 关于闭包、同步、异步问题


    for (var i = 0; i < 5; i++){
         setTimeout(function(){
              console.log(new Date, i)
         }, 1000);
    }
    console.log(new Date, " -> ", i)
    

    同步,异步,变量作用域,闭包。
    如果规定用箭头表示前后两次输出之间有1秒的间隔,而逗号表示其前后两次输出之间的间隔可以忽略
    5 -> 5,5,5,5,5

    1. 如果想输出5, 0, 1, 2, 3, 4
    // 方法1:JS中基础类型的参数传递是按值传递
    var output = function(i) {
         setTimeout(function() {
              console.log(new Date, i)
         }, 1000)
    }
    
    for (var i = 0; i < 5; i++){
         output(i)
    }
    
    console.log(new Date, i)
    
    // 方法2:IFEE声明即执行的函数表达式
    for (var i = 0; i < 5; i++) {
         (function(j){
              setTimeout(function(){
                   console.log(new Date, j)
              }, 1000);
         })(i);
    }
    console.log(new Date, i)
    
    1. 顺序输出数字
    const tasks = [];
    const output = (i) => new Promise((resolve) => {
         setTimeout(() => {
              console.log(new Date, i)
              resolve();
         }, 1000 * i);
    });
    // 生成全部的异步操作
    for (var i = 0; i < 5; i++){
         tasks.push(output(i));
    }
    // 异步完成之后,输出最后的i
    Promise.all(tasks).then(() =>{
         setTimeout(() => {
              console.log(new Date, i)
         }, 1000);
    });
    
    //方法2 ES7 async await TODO:失败
    const sleep = (timeoutMS) => new Promise((resolve) =>{
         setTimeout(resolve, timeoutMS);
    })
    (async () =>{
         for (var i = 0; i < 5; i++) {
              await sleep(1000);
              console.log(new Date, i);
         }
         await sleep(1000);
         console.log(new Date, i);
    })();
    
  • 相关阅读:
    算法之字符串
    linux环境无界面运行selenium
    用猴子补丁的方式解决 python unittest按定义的顺序执行用例
    adb命令行执行uiautomator2
    uiautomator2环境搭建
    jenkins安装
    python unittest自动化数据驱动demo
    uiautomator1与2的区别
    HttpRunnerManager学习
    接口测试
  • 原文地址:https://www.cnblogs.com/iFanLiwei/p/13554161.html
Copyright © 2020-2023  润新知