1. 我对promise的理解 :
promise 是 es6 提供的一种异步解决方案, promise
就是把异步操作换了一种写法从之前的嵌套回调函数变成了链式写法
promise 本身其实就是一个容器 里面放异步代码这样就可以让这个异步的代码执行 .then
.catch
的操作
2.什么是promise? 通过promise 能够解决什么问题?
promise
可以解决回调地狱的问题
回调地狱就是拿到 a 接口的数据才能根据 a 返回的数据请求 b 接口 而 c 接口要拿到 b 接口的数据才能请求
这样的回调函数
嵌套回调函数
的写法就叫回调地狱这样的写法会让代码臃肿后期难以维护
除了promise
以外 async
是解决决绝回调地狱的最终方案
3. promise
的特点(状态) ?
pending
进行 resolve
成功 和 reject
失败
pending
---->resolve
进行–>成功
pending
---->reject
进行 --> 失败
- 如果成功的话可以通过
resolve
⽅法将正确结果返回出去,通过.then 的⽅式进⾏接受, - 失败的话可以通过
reject
的⽅式将失败的结果返回出去,通 过.catch
的⽅式进⾏接受 pending
状态是进⾏中,⼀旦进⾏之后,他的状态是不可逆的
说⼀下 promise 怎么⽤?
如果要使⽤promise
,我们需要对 promise
进⾏实例化,在实例化的构造函数⾥⾯有⼀个回调函数,这个回调函数⾥⾯有两个参数,分别是 resolve
和 reject
我们可以通过 promise
的实例化对象调⽤.then 或 者.catch ⽅式接受结果
1.5 我们之前遇到的哪些东西本身就是一个 promise 对象?
jq 的 ajax 请求本身就是一个 promise 对象 所以可以直接用.then
axios 也是一个 promise 对象
原生的 ajax 以及 小程序的 wx.request 请求都不是 promise 对象 不能用.then 的写法,如果想用链式写法 就要自己封装一个 promise
3.说⼀下 async 和 await、以及他们和 promise 的区别?(必问)
⾸先 async 和 await 是解决异步的终极⽅案,async 和 await ⼀般配和使⽤,当我们给函数前⾯加上关键字 async,这个时候,这个函数的返回值就是⼀个 promise. ⽽ await 是⼀个同步的操作,await 只能配合 async 只能,不然会报错,await 后⾯可以是表达式,也可以是⼀个 promise,在await 下⾯的代码必须得等待 await 执⾏完之后才能在执⾏他们和 promise 的区别就是在写法上更加的简洁.以上就是我对 async 和 await 的理解.
4.generator 函数
generator 函数也是 es6 的处理异步回调的一种写法 但是这种写法现在被 async 取代了
generator 函数 用*表示 跟 yield 搭配使用
function* getdata2() {
yield $.ajax({
method: "get",
url: "data.json"
})
yield $.ajax({
method: "get",
url: "data2.json"
})
yield $.ajax({
method: "get",
url: "data3.json"
})
}
let obj = getdata2();
obj.next().value.then(res => {
console.log(res);
return obj.next().value
}).then(res => {
console.log(res);
return obj.next().value
}).then(res => {
console.log("generator拿到的数据", res);
})
// obj.next().value
// 它的下一个请求要通过 .next().value来执行下一个
//用generator处理回调地狱 但是这种写法一般不用因为async已经取代了generotor
5.promise 的 all 和 race 方法
promise 还给我们提供了.all 和 race, 其中 all ⽅法的作⽤是将多个请求合并成⼀个请求, ⽐如当⾸⻚
要请求 10 个接⼝,我们可以 promise.all 进⾏合并,.race 的作⽤也可以将多个请求合并成⼀个请求,不过
是谁先请求成功就先返回谁.
Promise.all([
$.ajax({
url: "data.json",
}),
$.ajax({
url: "data2.json",
}),
$.ajax({
url: "data3.json",
}),
]).then((res) => {
// console.log(res);
let [data, data2, data3] = res;
//解构数组
console.log(data, data2, data3);
}).catch(err => {
console.log(err);
})
//all方法可以并发请求 同时发送多个请求 当所有的请求都成功的时候才会执行then方法 res是一个数组 放的就是请求到的数据
Promise.race([
$.ajax({
url: "data.json",
}),
$.ajax({
url: "data2.json",
}),
$.ajax({
url: "data3.json",
}),
]).then((res) => {
console.log(res);
});
// race方法 也是执行多个请求 谁先请求成功 .then 方法请求到的数据就是谁