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方法,总是处于回调链的尾端,保证抛出任何可能出现的错误