写在前面:最近刷面经,被问到很多关于ES6的问题,当提到promise时,本以为回答的还不错,可是之后被怼了,说我理解得有问题,郁闷之余回来恶补一下,才发现自己当时只回答一些皮毛,这些不是面试官想听到的,败军之将,羞愧难当,写下此文章。覆车之鉴,望后人警示。
引流阮一峰大佬的文章-->Promise 对象
面试回答:
promise就是用来解决 异步 处理的, 不管在vue 中 还是 其他的 地方, 都一样, 一般vue 中我们会用axios来解决接口的问题, 但是如果有多个 接口A,B,C需要按照顺序调的时候, 就需要在封装axios的时候用promise , 做到 等待 前一个 接口A 完成, 再 执行B , 形成一个链式调用。
手写代码:
function fun(){
return new Promise((resolve,reject) => {
axios.post(url,data)
.then(response => {
resolve(response.data);
},err => {
reject(err)
})
})
}
const promise=new Promise((resolve,reject)=>{
axios.get(url,params)
})
promise.then(res=>{
})
promise.catch(err=>{
})
纯理论:Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise
对象。
Promise
对象代表一个异步操作,有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败)。
一旦状态改变,就不会再变,任何时候都可以得到这个结果。
promise有两个参数,成功、失败(resolve,reject)
有了Promise
对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise
对象提供统一的接口,使得控制异步操作更加容易
Promise
也有一些缺点。首先,无法取消Promise
,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise
内部抛出的错误,不会反应到外部。第三,当处于pending
状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。