对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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值