Promise

作者: 宋song一 | 来源:发表于2018-12-08 00:18 被阅读0次

    Javascript是一种单线程的语言,所有的代码必须按照所谓的“自上而下”的顺序来执行。本特性带来的问题就是,一些将来的、未知的操作,必须异步执行。异步执行可以用回调函数实现。异步操作会在将来的某个时间点触发一个函数调用
    在实际的使用当中,有非常多的应用场景我们不能立即知道应该如何继续往下执行。最重要也是最主要的一个场景就是ajax请求。通俗来说,由于网速的不同,可能你得到返回值的时间也是不同的,这个时候我们就需要等待,结果出来了之后才知道怎么样继续下去。
    Promise 表示一个异步操作的最终结果,与之进行交互的方式主要是 then 方法,该方法注册了两个回调函数,用于接收 promise 的终值或本 promise 不能执行的原因
    “承诺将来会执行”的对象在JavaScript中称为Promise对象

    实际上Promise上的实例_promise是一个对象,不是一个函数。在声明的时候,Promise传递的参数函数会立即执行,因此Promise使用的正确姿势是在其外层再包裹一层函数。每个Promise的实例对象,都有一个then的方法,这个方法就是用来处理之前各种异步逻辑的结果
    一个 Promise 的当前状态必须为以下三种状态中的一种:等待态(Pending)、执行态(Fulfilled)和拒绝态(Rejected)
    Promise的构造函数接收一个函数作为参数,该函数接受两个额外的函数,resolve和reject,Promise正是通过这两个函数来控制异步操作的结果
    catch方法除了中断链式调用,还有try catch的作用,也就是说,then里面的逻辑代码如果出现了错误,并不会在控制台抛出,而是会直接由catch捕获
    then(null, function() {}) 就等同于catch(function() {})

    1.解决的问题

    • 回调地狱
    • 为了我们的代码更加具有可读性和可维护性,我们需要将数据请求与数据处理明确的区分开来

    现在所有的库几乎都将ajax请求利用Promise进行了封装,因此我们在使用jQuery等库中的ajax请求时,都可以利用Promise来让我们的代码更加优雅和简单。这也是Promise最常用的一个场景,因此我们一定要非常非常熟悉它,这样才能在应用的时候更加灵活

    2.ES6对Promise标准的扩展

    2.1 Promise.all的扩展

    本扩展实现了将多个异步操作合并为一个操作,也就是并行处理异步,最后统一操作结果,注意:本方法只能通过Promise对象直接调用,实例不能进行此操作。

    all()接收一个参数数组,数组中的每一项都对应一个

    2.1 Promise.race的扩展

    race本意为赛跑,顾名思义,race的用法就是并列的几个异步操作,谁先处理结束就以谁为准。race接收一个参数数组
    第一个结束的异步操作回调后,其它的异步操作还会继续执行,只是并不会继续进入then了而已

    相关文章

      网友评论

          本文标题:Promise

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