谈谈Promise那点事(一)

谈谈Promise那点事(一)

随着es6流行 Promise使用非常的广泛 那那都是Promise 异步请求返回一个Promise对象,Generator 中 yield 后面一般跟 Promise 对象, 等等到处都是Promise 我们真的搞明白了? 我们来简单唠唠

  • Promise的规范

    1. 一个Promise 有三种状态等待(pending)、已完成(fulfilled)、已拒绝(rejected)

      一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换

    2. 一个Promise 有一个then方法
      接收两个可选函数参数onFulfilled、onRejected而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
  • Promise的API

    1. 实例的方法
      .then(resolvedFn, rejectFn)方法 .then 为Promise添加一个状态改变时候的回调 返回值一个新Promise的实例
      .catch()方法 返回值也是一个Promise对象 Promise对象的错误具有冒泡性质 错误一直往后面传递 知道一直被这个 catch捕获 正因为 这些实例方法都是Promise对象 所以可以通过链式调用
    2. 静态的方法
      Promise.resolve()方法

      将对象转为Promise对象比如

          var jsPromise = Promise.resolve($.ajax('/whatever.json'));
          Promise.resolve('foo')
          // 等价于
          new Promise(resolve => resolve('foo'))复制代码

      Promise.resolve() 方法参数有四种情况

      • 如果参数是Promise实例 那返回也就是就是这个实例
      • 如果返回时thenable 对象(含有then的对象) 则先将其转换为promise对象,然后立即执行这个对象的then方法

          let thenable = {
           then: function(resolve, reject) {
             resolve(42);
           }
          }
        
         let p1 = Promise.resolve(thenable);
         p1.then(function(value) {
           console.log(value);  // 42
         });复制代码
      • 如果参数是个原始值,则返回一个promise对象,状态为resolved,这个原始值会传递给回调

         var p = Promise.resolve('Hello');
        
         p.then(function (s){
           console.log(s)
         });
         // Hello复制代码
      • 没有参数,直接返回一个resolved的Promise对象

         var p = Promise.resolve();
         p.then(function () {
           // ...
         });
         这里p  就是Promise对象复制代码

      Promise.reject()方法
      同上,不同的是返回的promise对象的状态为rejected

      Promise.all()方法
      Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

      var p = Promise.all([p1, p2, p3]);复制代码

      这里参数是数组 p123都是Promise实例 如果不是Promise实例 会用到Promise.resolve() 转为Promise实例

      1. 如果全部成功,状态变为resolved,返回值将组成一个数组传给回调
      2. 只要有一个失败,状态就变为rejected,返回值将直接传递给回调
      3. 返回值也是个Promise实例
      // 生成一个Promise对象的数组
      var promises = [2, 3, 5, 7, 11, 13].map(function (id) {
       return getJSON('/post/' + id + ".json");
      });
      
      Promise.all(promises).then(function (posts) {
       // ...
      }).catch(function(reason){
       // ...
      });复制代码

      上面解释下 Promises是包含6个promise实例的数组 这6个都变成都成功fulfilled 或者其中一个失败rejected 都会调用all方法 后面回调函数
      这里注意下若果自己定义了catch 捕获 那么在all里面是捕获不到的

Promise.race()方法

  1. 同上,区别是,只要有一个Promise实例率先发生变化(无论是状态变成resolved还是rejected)都触发then中的回调,返回值将传递给回调
  2. race()的返回值也是新的Promise对象

Promise初尝一
参考链接ECMAScript 6 入门(阮一峰)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值