命题角度三条线:
问:说说你理解的 Promise
答题要点:代理对象、三个状态、状态切换机制
Promise 对象是一个代理对象,他的值是不确定的,可能是成功的值也可能是失败的值
三个状态:
状态是可以改变的,但它只允许被改变一次
问:Promise 的出现是为了解决什么问题?
回调地狱,带来的可读性和可维护性被破坏
问:Promise 常见方法有哪些?各自是干嘛的?
这道题需要答出 all、race、reject 和 resolve。
例子:Promise.all([p1, p2, p3])
执行多个 promise,返回一个新的 promise 对象,全部执行成功后触发 then,任意一个失败触发 catch
var p1 = Promise.resolve('1号选手');var p2 = '2号选手';var p3 = new Promise((resolve, reject) => {setTimeout(resolve, 100, '3号选手');});Promise.all([p1, p2, p3]).then((values) => {console.log(values); // ["1号选手", "2号选手", "3号选手"]});
例子:Promise.race([p1, p2, p3])
执行多个 promise,返回一个新的 promise 对象,任意一个执行成功或失败后,调用对应的 then 或 catch 方法
返回一个状态为失败的 Promise 对象
它返回一个 Promise 对象
const promise = new Promise((resolve, reject) => {console.log(1);resolve();console.log(2);});promise.then(() => {console.log(3);});console.log(4);
运行结果:1,2,4,3
let promise = new Promise((resolve, reject) => {resolve('第 1 次 resolve');console.log('resolve后的普通逻辑');reject('error');resolve('第 2 次 resolve');});promise.then((res) => {console.log('then: ', res);}).catch((err) => {console.log('catch: ', err);});
运行结果:
resolve后的普通逻辑then: 第 1 次 resolve
考点点拨:Promise 对象的状态只能被改变一次
Promise.resolve(1).then(Promise.resolve(2)).then(3).then().then(console.log);
运行结果:1
考点点拨:Promise 值穿透问题
then 方法只接受函数为参数,其他值会跳过
终于要手写 promise 了!内容较多,移步下一节。