对promise的理解
一、什么是promise?通过promise能够解决什么问题?
定义:promise 是 es6 提供的一种异步解决方案,从之前的嵌套回调函数转化成了链式写法
解决: 通过promise能够解决回调地狱问题.
(回调地狱:回调函数嵌套回调函数的写法,这样会让代码变得臃肿,后期难以维护)
(除了 promise 之外 async 是解决回调地狱的最终方案)
二、说一下promise的特点?也就是三种状态?
promise 共有三个状态,分别是 进⾏中(pending),成功(resolve) 或者 失败(reject)
若成功的话可以通过 resolve ⽅法将正确结果返回出去,通过.then 的⽅式进⾏接收,
失败的话可以通过 reject 的⽅式将失败的结果返回出去,通 过.catch 的⽅式进⾏收,
pending 状态是进⾏中,⼀旦进⾏之后,他的状态是不可逆的
new Promise((resolve,reject) => {
//异步请求操作
setTimeout(() => {
//成功时调用 resolve()
resolve('Hello World')//执行 resolve() 函数后,会调用 Then() 函数
//失败时调用 reject(),一旦调用 reject(),就不会执行 resolve()
//reject('error message)
},1000)
}).then(data => {
//对异步请求的结果进行处理
console.log(data) //Hello World
}).catch(err => {
console.log(err)
})
三、说一下promise怎么用?
若要使⽤ promise,我们需要对 promise 进⾏实例化,在实例化的构造函数⾥⾯有⼀个回调函数,这个回调函数⾥⾯有两个参数,分别是 resolve 和 reject,我们可以通过 promise 的实例化对象调⽤ .then 或 者 .catch ⽅式接受结果
四、说一下promise的all方法和race方法?
all 作⽤:将多个请求合并成⼀个请求,
(⽐如当⾸⻚要请求 10 个接⼝,我们可以 promise.all 进⾏合并)
race 作⽤:也可以将多个请求合并成⼀个请求,不过是谁先请求成功就先返回谁.
//Promise.all 接收一个promise对象数组为参数
const p1 = new Promise((resolve, reject) => {
resolve(1);
});
const p2 = new Promise((resolve, reject) => {
resolve(2);
});
const p3 = new Promise((resolve, reject) => {
reject(3);
});
Promise.all([p1, p2, p3]).then(data => {
console.log(data); // [1, 2, 3] 结果顺序和promise实例数组顺序是一致的
}, err => {
console.log(err);
});
//Promise.race 只要有一个promise对象进入 FulFilled 或者 Rejected 状态的话,
//就会继续进行后面的处理。
//Promise.race 接收一个promise对象数组为参数
function timerPromisefy(delay) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(delay);
}, delay);
});
}
var startDate = Date.now();
Promise.race([
timerPromisefy(10),
timerPromisefy(20),
timerPromisefy(30)
]).then(function (values) {
console.log(values); // 10
});
五、说⼀下在项目中使用promise做过什么?
在项目中,当我们要请求多个接口,在上一个接口请求成功之后,用上一个请求成功的数据作为参数 去请求下一个 接口 这时就需要 使用Promise
六、我们之前遇到的哪些东西本身就是一个 promise 对象?
JQuery 的 ajax 请求本身就是一个 promise 对象 所以可以直接用.then
axios 也是一个 promise 对象
原生的 ajax 以及 小程序的 wx.request 请求都不是 promise 对象 不能用 .then 的写法,
如果想用链式写法 就要自己封装一个 promise