• 原生JS中 callback,promise,generator,async-await 的简介


    callback,promise,generator,async-await 的简介

    javascript异步的发展历程。

    ES6 以前:

      回调函数(callback):nodejs express 中常用,ajax中常用。

    ES6:

      promise对象:nodejs最早有bluebird promise的雏形,axios中常用。

      generator函数:nodejs koa框架使用率很高。

    ES7:

      async/await语法:当前最常用的异步语法,nodejs koa2 完全使用该语法。

     回调函数callback

    回调函数实际就是一个参数;

    将一个函数当做参数传到另一个函数里,当那个函数执行完后,再执行传进去的这个函数;这个过程就叫做回调。

    promise对象

    promise 对象用于一个异步操作的最终完成(或最终失败)及其结果的表示。

    简单地说就是处理一个异步请求。我们经常会做些断言,如果我赢了你就嫁给我,如果输了我就嫁给你之类的断言。

    这就是promise的中文含义:断言,一个成功,一个失败。

     promise构造函数的参数是一个函数,我们把它称为处理器函数。

    处理器函数接收两个函数reslove和reject作为其参数,当异步操作顺利执行则执行reslove函数, 当异步操作中发生异常时,则执行reject函数。

    通过resolve传入得的值,可以在then方法中获取到,通过reject传入的值可以在chatch方法中获取到。

    因为then和catch都返回一个相同的promise对象,所以可以进行链式调用

     

    generator函数

    S6的新特性generator函数(面试的时候挂在这里),中文译为生成器,在以前一个函数中的代码要么被调用,要么不被调用,还不存在能暂停的情况。

    generator让代码暂停成待执行,定义一个生成器很简单,在函数名前加个*号,使用上也与普通函数有区别

     

    上面便是一个简单的generator声明例子。

    generator函数不能直接调用,直接调用generator函数会返回一个对象,只有调用该对象的next()方法才能执行函数里的代码。

     

    执行该函数:

     

    其实单独介绍generator并没有太大的价值,要配合key yield,才能真正发挥generator的价值。

    yield能将生Generator函数的代码逻辑分割成多个部分,下面改写上面的生成器函数

     

    可以看到这段代码执行到第一个yield处就停止了,如果要让里边所有的代码都执行完就得反复调用next()方法

     

    generator函数与回调函数的区别

     回调函数

    这是一个典型的回调嵌套,过多的回调嵌套造成代码的可读性和可维护性大大降低

    generator函数

     

    generator函数的强大在于允许你通过一些实现细节来将异步过程隐藏起来,依然使代码保持一个单线程、同步语法的代码风格

    async-awit

     async函数返回一个promise对象,如果在async函数中返回一个直接量,async会通过Promise.resolve封装成Promise对象。
    我们可以通过调用promise对象的then方法,获取这个直接量。

     

    过async函数不返回值的结构??

    await会暂停当前async的执行,await会阻塞代码的执行,直到await后的表达式处理完成,代码才能继续往下执行。

    await后的表达式既可以是一个Promise对象,也可以是任何要等待的值。

    如果await等到的是一个 Promise 对象,await 就忙起来了,它会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。

    上边你看到阻塞一词,不要惊慌,async/await只是一种语法糖,代码执行与多个callback嵌套调用没有区别。

    简而言之-async/await是以同步的思维去写异步的代码,所以async/await并不会影响node的并发数

    如果它等到的不是一个 Promise 对象,那 await 表达式的运算结果就是它等到的东西

     

     参考资源:https://www.cnblogs.com/peiyu1988/ 简单的整理和总结

    -------------------------------------------

    个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

    万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!

  • 相关阅读:
    linux grep --我最喜欢的命令~~
    svmrank 的误差惩罚因子c选择 经验
    转:机器学习中的算法(2)-支持向量机(SVM)基础
    转:关于python文件操作大全
    python 求两个时间差
    多个excel合并(excel2007)
    oracle12c 新建表空间
    数据库表被锁了
    join ,left join ,right join有什么区别
    最简洁的权限(菜单)控制
  • 原文地址:https://www.cnblogs.com/mahmud/p/10188954.html
Copyright © 2020-2023  润新知