es6 学习笔记4

1、proxy

  用于修改默写操作的默认行为,可以对外界的访问进行过滤和改写

  new proxy(target, handler); target参数表示索要拦截的目标对象,handler参数也是一个对象,用来定制拦截行为。

  拦截的部分操作:

  (1)get(target,propKey,recever);拦截对象属性的读取,比如proxy.foo和proxy['foo']

  (2)set(target,propKey,value,recever);拦截对象属性的设置,比如proxy.foo=v或者procy['foo']=v,返回一个布尔值

  (3)apply(target, object, args);拦截proxy实例作为函数调用的操作,比如proxy(...args)proxy.call(object, ...args)proxy.apply(...)

  (4)construct(target, args);拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)

 2、promise

  <1>这个函数有两个特点: (1)对象的状态不受外界影(2)一旦状态改变,就不会在变,任何时候都可以得到这个结果(即也叫做已定型)

  <2>promise构造函数接收一个函数作为参数,该函数的两个参数分别是resolve和reject. 

var promise = new Promise(functioin(resolve, reject) {
      if(/*异步操作成功*/)  {
             resolve(value) 
       }else {
             reject(error)
       }
});

  (1)resolve函数的作用是,将promise对象的状态从未完成变成成功,在异步操作成功时调用,作为参数传递出去

  (2)reject函数的作用是,将promise对象的状态从未完成变成失败,在异步操作失败的时调用,并将一步操作报出的错误,作为参数传递出去

  一般来说,调用resolve或者reject以后,Promise的使命就完成了,后继的操作应该放到then里面,不可以直接写在resolve和reject的后面,所以,最好是在resolve和reject的前面加上return语句,这样就不会有意外。

  <3>实例生成之后,可以用then方法分别指定resolved状态和rejected状态的回调函数    

promise.then(function(value){
   // 成功
},function(error) {
   // 失败
})

  PS:<3>的使用没有<4>的好

  <4>.catch方法是.then(null, rejection)的别名用于指定发生错误时的回调函数。    

promise.then(function(value) {

}).catch(function(error) {
    
})    

  如果catch前面有多个then的话,任何一个抛出错误都会被catch捕获,所以一般不会在then里面定义reject状态的回调函数,都是使用catch方法

  <5>promise的内部错误不会影响到promise外部的代码

  <6>node有一个unhandledRejection事件,专门监听未捕获的reject错误,但是,node有计划在未来废除unhandledRejection事件,如果promiase内部有位不多的错误,会直接终止进程,并且进程的退出吗不为0

  <7>.all用户将多个实例包装成一个新的promise实例,Promise.all方法接收一个数组做为参数,也可以不是数组,但必须是Iterator接口,且返回的每个成员都是Promiase实例 

let promiseAll = Promise.all([p1,p2,p3])

      promiseAll的状态由p1,p2,p3决定,分成两种情况:

    (1)只有p1,p2,p3的状态都是fulfilled,promiseAll的状态才会变成fulfilled,此时p1,p2,p3的返回值组成一个数组,传递给promiseAll的回调函数

    (2)只有p1,p2,p3之中有一个被rejected,promiseAll的状态就变成rejected,此时第一个被reject的实例的返回值,就会传递给promiseAll的回调函数

  <8>.finally()用于指定不管promise对象最后的状态如何,都会执行的操作。它接受一个普通对调函数作为参数

  <9>.done()不管then方法或catch方法结尾,要是最后一个方法炮竹错误,都有可能无法捕捉到,因此,我们可以提供一个done方法,总是处于回调链的尾端,保证抛出任何可能出现的错误

  

     

    

 

posted @ 2017-11-07 18:33  逆光飞翔23  阅读(133)  评论(0编辑  收藏  举报