// await实现 
    // 模拟其他语言中的 sleep,实际上可以是任何异步操作
    const sleep = (timeountMS) => new Promise((resolve) => {
      setTimeout(resolve, timeountMS);
    });

    (async () => {  // 声明即执行的 async 函数表达式
      for (var i = 0; i < 5; i++) {
        if (i > 0) {
          await sleep(1000);
        }
        console.log(new Date, i);
      }

      await sleep(1000);
      console.log(new Date, i);
    })();

 

 
    // Promise 实现   注意:这里并没有完全按顺序依次执行输出,仅在等待前面循环输出完成后,输出最后一次
    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);
    });

 

// 此例为按顺序依次执行输出

  var promiseList = Promise.resolve();                    // 新建一个立即执行的 Promise
    const output = (i) => {                               // 创建闭包,在循环中保留当前参数
      promiseList = promise.then(() => {                  // 按照循环为 PromiseList 赋值,创建一个所有循环中将要执行的函数体组成,then 连接的异步执行链
        return new Promise((resolve) => { 
          window.setTimeout(() => { 
            console.log(i) 
            resolve(); 
          }, 1000) 
        }) 
      }) 
    } 
    for (var i = 0; i < 5; i++) {                         // 循环创建执行链
      output(i); 
    }

 

posted on 2022-01-14 14:12  occc  阅读(680)  评论(0编辑  收藏  举报