面试总结:Promise有关面试的知识点。

Promise是为了解决异步编程出现的地狱回调问题而提出来的。

Promise的优点与缺点:

优点:Promise其实就是做了一件事情,它是对异步操纵进行了封装,然后可以将异步操纵以同步的流程表达出来,避免了层层嵌套的回调函数,同时提供了同一的接口,使得控制异步操纵更加容易。

缺点:1.无法取消Promise,一旦被创建它就会立刻去执行,无法中途取消

2.如果不设置回调函数,Promise内部的错误无法反应到外部

3.当处于未完成状态时,无法得知目前进行到那个状态。

初识Promise

var p=new Promise(function (resolve,rejecct) {

 if(/*异步操纵成功*/) {

   resolve(res)

}else {

reject(error)

}

})

p.then(function (value) {

//完成态

},function (error) {

//失败态

})

我们在通过Promise构造函数实例化一个对象时,会传递一个函数作为参数,这个函数会立即执行。

在Promise中,对一个异步操纵做出了抽象的定义,Promise操纵只会处  在3种状态中的一种

即未完成态-->完成态,未完成态-->失败态。注意:状态一旦转化就不能更改。

只有异步操作才可以决定当前是那种状态,任何其他操作都无法改变这个状态。

在声明一个Promise实例时,我们传入的匿名函数参数中:

 resolve:代表成功态之后的操纵

reject:代表失败态之后的操纵

我们在调用对象实例then()方法传递的两个参数中:

第一个参数(函数)对应着完成态的操作,也就是resolve

第二个参数(函数)对应着失败态的操作,也就是reject

也就是说在Promise中通过then()方法 来指定处理异步操作结果的方法

Promise进阶

resolve/reject参数

reject函数的参数一般来说是Error对象实例,而resolve函数的参数除了正常值外,还有可能是另一个Promise实例,表示异步操作的结果有可能是一个值,也有可能是另一个异步操作

console.time('Promise example start')
var p1 = new Promise( (resolve, reject) => {
    setTimeout(() => resolve('hi'), 3000);
});

var p2 = new Promise( (resolve, reject) => {
    setTimeout(() => resolve(p1), 10);
});

p2.then( ret => {
    console.log(ret);
    console.timeEnd('Promise example end')
});

p2会等待p1的执行结果,然后再执行,从输出hi可以看到p1完成状态转变之后,传递给resolve(或者reject)的结果会传递给p2中的resolve

 then()

then()方法是Promise实例的方法,即Promise.prototype上的,它的作用是为Promise实例对象添加状态改变时的回调函数

第一个参数是resolve状态的回调函数,第二个参数是reject状态的回调函数。then()方法会返回一个新的Promise实例,这样就可以使用链式操纵了。还有一点,就是链式中的then方法(从第二个开始),它们resolve中的参数是前一个then()当中resolve的return语句的返回值

catch()错误处理

catch方法是Promise实例的方法,即Promise.prototype上的属性,它其实就是.then(null,rejection)的简写,用于指定错误时的回调函数。Promise对象的Error对象具有冒泡的性质,会一直向后传递直到被捕获为止。也就是说错误总会被下一个catch语句所捕获。因为有了这种方便的错误处理机制,所以一般不要在then()方法中定义reject状态的回调函数,而是使用catch方法来捕获错误。

catch的返回值,它返回的是一个Promise对象,因此还可以其后面调用then()方法。当出错时,catch会先处理之前的错误,然后通过return把值返回给下一个then()方法之中。如果没有错,就直接跳过catch()方法

 Promise对象方法

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

如:var p=Promise.all([p1,p2,p3])

新的Promise实例p的状态是由p1,p2,p3来决定

当p1,p2,p3都为完成态时,p为完成态

当p1,p2,p3任意一个为失败态时,p为失败态

Promise.race()方法也是将多个promise实例,包装成一个新的promise实例。它的状态只要p1, p2, p3中任意一个实例率先改变状态,则p的状态就跟着改变,而且状态由率先改变的实例决定。

 详细的讲解见:https://segmentfault.com/a/1190000007685095

猜你喜欢

转载自blog.csdn.net/mrhuanhuan/article/details/82931054
今日推荐