闭包

作者: cooqi | 来源:发表于2018-07-18 10:58 被阅读0次

    https://www.jb51.net/article/109005.htm
    今天突然看到这篇文章,发现很多新大陆,
    正好前不久看来下promise,感觉还是很强大的

    循环输出12345

    常规写法
    for (var i = 0; i < 5; i++) {
     (function(j) {
      setTimeout(function() {
       console.log(new Date, j);
      }, 1000 * j)); // 这里修改 0~4 的定时器时间
     })(i);
    }
     
    setTimeout(function() { // 这里增加定时器,超时设置为 5 秒
     console.log(new Date, i);
    }, 1000 * i);
    
    进阶写法,主要是理解promise和Promise.all
    const tasks = []; // 这里存放异步操作的 Promise
    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);
    });
    
    高阶写法 ,理解Promise+async ,await

    async 函数返回的 Promise 对象,必须等到内部所有的 await 命令的 Promise 对象执行完,才会发生状态改变

    // 模拟其他语言中的 sleep,实际上可以是任何异步操作
    const sleep = (timeountMS) => new Promise((resolve) => {
     setTimeout(resolve, timeountMS);
    });
     
    (async () => { // 声明即执行的 async 函数表达式
     for (var i = 0; i < 5; i++) {
      await sleep(1000);
      console.log(new Date, i);
     }
     
     await sleep(1000);
     console.log(new Date, i);
    })();
    
    精简写法,let
    for (let i = 0; i <= 5; i++) {
     setTimeout(function() {
      console.log(new Date, i);
     }, 1000*i);
    }
     
    
    

    相关文章

      网友评论

          本文标题:闭包

          本文链接:https://www.haomeiwen.com/subject/ldqopftx.html