asyns/await初体验

作者: 该帐号已被查封_才怪 | 来源:发表于2017-07-29 10:03 被阅读125次

一、入门例子1

我们在没有使用asyns/await时,先看下面的代码:

  var sleep=function () {
      setTimeout(()=>{
        console.log("我在中间执行")
    },5000)
  };
  var start=   function () {
    try{
      console.log("我最先执行");
       sleep() ;
      setTimeout(()=>{
        console.log("我最后执行");
    },2000)
    } catch(error){
      console.log("出错了",error)
    }
  };
  start();

上述代码运行结果

image.png

显然,这段代码是同步执行的,没有满足我们的预期,使用asyns/await异步可以轻松解决:

  var sleep=function () {
      return  new  Promise(function (reslove,reject) {
          setTimeout(()=>{
              console.log("我在中间执行")
            reslove();
          },5000)
      })
  };
  var start=  async function () {
      try{
        console.log("我最先执行");
        await sleep() ;
        setTimeout(()=>{
          console.log("我最后执行");
        },2000)
      } catch(error){
          console.log("出错了",error)
      }
  };
  start();

上述代码运行结果

image.png

使用asyns/await需要注意的是:

1、await 必须在async 声明的函数的上下文中;
2、 await 后面跟的函数应该返回的是promise对象,否则其它返回值就没意义了;

二、入门例子2--传递数据

上面例子中promise没有传数据,这次稍微修改下

  var sleep=function () {
      return  new  Promise(function (reslove,reject) {
          setTimeout(()=>{
              console.log("我在中间执行")
            reslove("我是数据哦");
          },4000)
      })
  };
  var start=  async function () {
      try{
          console.log("我最先执行");
          let data=await sleep() ;
          console.log("我最后执行,我得到的数据是:",data);
      }catch(error){
          console.log("出错了",error)
      }
  };
  start();

上述代码运行结果:

image.png

三、入门例子3--捕获异常

  var sleep=function () {
      return  new  Promise(function (reslove,reject) {
          setTimeout(()=>{
              console.log("我在中间执行")
            reject("reject被执行啦。。。");
          },4000)
      })
  };
  var start=  async function () {
      try{
          console.log("我最先执行");
          let data=await sleep() ;
          console.log("我最后执行,我得到的数据是:",data);
      }catch(error){
          console.log("出错了,错误原因是",error)
      }
  };
  start();
image.png

四、入门例子--await必须在async声明的函数的上下文中

  var sleep=function () {
      return  new  Promise(function (reslove,reject) {
          setTimeout(()=>{
              console.log("我在中间执行")
            reslove();
          },3000)
      })
  };
  var start=  async function () {
      try{
          let ten=[1,2,3,4,5,6,7,8,9,10];
          console.log("我最先执行");
       for (let v of ten){
         console.log(`当前是第${v}次等待..`);
         await sleep(); //这里的上下文还是async
       }
          console.log("我最后执行");
      }catch(error){
          console.log("出错了,错误原因是",error)
      }
  };
  start();

上述代码运行结果

image.png

因为

 for (let v of ten) {
     console.log(`当前是第${v}次等待..`);
         await sleep();
}

中的for (let v of ten) 上下文还在async函数中,如果将for (let v of ten)相关部分改成

ten.forEach(function (v) {
          console.log("forEach 里的this",this);
          console.log(`当前是第${v}次等待..`);
          await sleep(); // 不是在async函数上下文中 而是在forEach 中了
        });

这样就不行了,因为此时的await sleep(); 不是在async函数上下文中。

参考资料:

1、体验异步的终极解决方案-ES7的Async/Await

*本文版权归本人即简书笔名:该账户已被查封 所有,如需转载请注明出处。谢谢!

相关文章

  • asyns/await初体验

    一、入门例子1 我们在没有使用asyns/await时,先看下面的代码: 上述代码运行结果 显然,这段代码是同步执...

  • Promise对象

    Promise对象是一种解决异步问题的方法,还有的解决方案是asyns 和 await (es7) 这么是目前的终...

  • 前端基础(问答11)

    keywords: 白屏、FOUC、asyns、defer、渲染机制、JavaScript数据类型、。 CSS和J...

  • yii初体验(7-15)

    yii初体验(7)视图 yii初体验(8)模块 yii初体验(9) 小部件widgets yii初体验(10) 前...

  • async和await

    浅谈Async/Await用 async/await 来处理异步 async和await async:声明一个异步...

  • JS 中的 async/await

    async/await 是什么? async/await 是 ES2017 中新增的异步解决方案; await 只...

  • vue for 循环中使用 await

    vue for 循环中使用 await(转) await 和 async必须成对出现,如果调用await的地方,无...

  • ES8(一) —— async&await

    目录 async和普通函数的区别 await async/await处理多回调异步 async和await必须配合...

  • python的异步初体验(gevent、async、await)

    网络爬虫,这种io高密集型的应用由于大部分的时间在等待响应方面,所以CPU的使用率一直不高,速度也不快,为了解决这...

  • 小程序-云开发

    async和await async:异步(无等待)await:等待(是为了同步) 一、await 关键字只在 as...

网友评论

    本文标题:asyns/await初体验

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