promise理解,promise有关面试记录

promise含义

本质上,一个promise是某个函数返回的对象,你可以把回调函数绑定在这个对象上,而不是把回调函数当作参数传进函数。

promise/A+规范

  1. 一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
  2. 一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
  3. promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
  4. then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。

promise API

方法:
1. Promise.resolve()—— 返回一个promise对象

注意点:
1、返回一个状态由给定value决定的Promise对象(有三种value类型)。
2、类型一,value值是一个Promise对象,则直接返回该对象
3、类型二,value值是thenable(即,带有then方法的对象),返回的Promise对象的最终状态由then方法执行决定
4、类型三,value值为空、基本类型或者不带then方法的对象,返回的Promise对象状态为fulfilled,并且将该value传递给对应的then方法。
5、使用场景:如果不知道一个值是否是Promise对象,使用Promise.resolve(value) 来返回一个Promise对象,这样就能将该value以Promise对象形式使用。

2. Promise.reject()——返回一个状态为失败的promise对象
返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的处理方法

3. Promise.all(iterable)—— 所有成功才成功,一个失败即失败

注意点:
1、该方法返回一个新的promise对象,只有所有的对象成功,才会触发成功,只要有一个失败,就会触发该对象失败。
2、如果该promise对象成功,会把一个包含iterable里所有promise返回值的数组作为成功回调的返回值,顺序跟iterable的顺序保持一致
3、如果该promise对象失败,它会把iterable里第一个触发失败的promise对象的错误信息作为它的失败错误信息。
4、Promise.all方法常被用于处理多个promise对象的状态集合。

4. Promise.race(iterable)——竞速,最快的一个

注意点:
1、只要有任意一个子promise成功或失败,就会触发父promise对应的状态,并返回该promise对象
2、第一个promise对象变为Fulfilled之后,并不会取消其他promise对象的执行。只是只有先完成的Promise才会被Promise.race后面的then处理。其它的Promise还是在执行的,只不过是不会进入到promise.race后面的then内。

原型方法:
1. Promise.prototype.then(resolved,rejected)

注意点:
1、then有两个参数,第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数
2、then返回的是一个新的 promise, 将以回调的返回值来resolve.

2. Promise.prototype.catch()

注意点:
1、添加一个拒绝(rejection) 回调到当前 promise, 返回一个新的promise,因此catch后面还可以接着调用then方法。(catch只是then的语法糖,相当于.then(null, rejection)的别名,用于指定发生错误时的回调函数。)
2、当这个回调函数被调用,新 promise 将以它的返回值来resolve,否则如果当前promise 进入fulfilled状态,则以当前promise的完成结果作为新promise的完成结果.(即如果在resolve后再throw错误,是不会被catch到的,因为状态改变后不可逆
3、Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。(无论前面有多少个then,它们抛出的错误总是会被下一个catch语句捕获。
4、当catch前后都有多个then的时候,只有catch前面的then们发生了错误才会进入catch,否则跳过catch,继续执行catch后面的then(只有rejected才会进入catch,否则跳过
5、catch方法之中,还能再抛出错误。如果只有一个catch,当catch发生错误时,这个错误不会被捕获,也不会传递到外层。如果有多个catch连写,那么下一个catch就会捕获上一个catch的错误。

3. Promise.prototype.finally()

注意点
1、finally() 方法的回调函数不接受任何参数
2、无论成功还是失败都会执行
3 、finally() 方法总是会返回原来的值。

面试有关

1、说说promise规范
2、关于catch的一系列提问,如catch后还能不能再catch到错误,catch后还能不能继续写then,then后面的catch还能不能catch到then的错误之类的。

  1. 如果异步操作抛出错误,状态就会变为Rejected,就会调用catch方法指定的回调函数,处理这个错误。
  2. then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
  3. 在resolve()后面抛出的错误会被忽略(如果前面已经是执行了resolve,那么后面throw 出来的error不会被catch到)
  4. catch方法返回的还是一个Promise对象,因此后面还可以接着调用then方法。
  5. 在异步函数中抛出的错误不会被catch捕获到(例如使用了setTimeout之类的,抛出来的错误不会被catch到)
  6. 有多个catch连写,如果在catch中继续throw出异常,那么后面的catch就会一直执行,如果不throw异常,则不会执行(catch其实是then的语法糖)

3、 现有4个接口地址/a,/b,/c,/d,需要测试出当中的相应速度(处理完成并返回结果)最快的一个接口的耗时,请写出实现过程,可以使用setTimeout来模拟异步请求。

var promise1 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 500, 'one');
});

var promise2 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then(function(value) {
  console.log(value);
  // Both resolve, but promise2 is faster
});
// expected output: "two"

  1. setTimeout、async、promise执行顺序是如何的
    https://blog.csdn.net/baidu_33295233/article/details/79335127

参考:
使用Promise
Promise
Promise对象

你可能感兴趣的:(promise理解,promise有关面试记录)