学习promise笔记

37 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情 啥是promise promise就是爱的诺言,在js里是一种异步编程的解决方案

ES6中提供了原生的Promise对象,(面试都这么背)promise有三种状态,待定pending/ 成功fulfilled/失败rejected,promise状态一旦从pending变到fulfilled或者rejected后就不回再发生改变

image.png

用法

Promise对象是一个构造函数,用来创建Promise实例,接收一个function 参数,这个function有两个参数,一个resolve函数,一个是reject函数,执行resolve函数会把promise状态变更为fulfilled(成功),执行reject函数会把promise的状态变更为rejected(失败)

const promise = new Promise(function (resolve, reject) {
    console.log('promise')
    setTimeout(() => {
        console.log("异步完成")
        resolve();
    }, 1000)
});

new Promise后,会立刻执行传入的funciton,打印promise,1s后会打印异步完成,然后调用resolve方法,promise状态从pending变更为fulfilled。

promise对象的方法

then

new Promise返回promise实例,promise实例有then方法,then方法接收两个函数参数,第一个参数当状态从pedding到成功时执行,第二个是从pending到失败时执行。第一个参数的形参是用来接收resolve时传入的实参的,第二个参数的形参,是接收reject方法的实参的。

const promise = new Promise(function (resolve, reject) {
    console.log('promise')
    setTimeout(() => {
        console.log("异步完成")
        reject('错误');
    }, 1000)
});
promise.then(function (res) {
    console.log("成功", res)
}, function (err) {
    console.log("失败", err)
})
// 输出如下
//promise
//异步完成
//失败 ok

const promise = new Promise(function (resolve, reject) {
    console.log('promise')
    setTimeout(() => {
        console.log("异步完成")
        resolve('错误');
    }, 1000)
});
promise.then(function (res) {
    console.log("成功", res)
}, function (err) {
    console.log("失败", err)
})
//promise
//异步完成
//成功 错误

then方法返回的是一个新的Promise实例,方便我们采用链式写法。比如then后面接着写then,当第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。这种链式方式可以很方便的指定一组按照次序调用的回调函数。

const promise = new Promise(function (resolve, reject) {
    console.log('promise')
    setTimeout(() => {
        console.log("异步完成")
        resolve('ok');
    }, 1000)
});
promise.then(function (res) {
    console.log("成功", res);
    return '下个 then 参数'
}).then(function (res) {
    console.log('then', res)
})

catch

状态就会变为rejected时,then方法没有传入reject的回调函数,就会调用catch()方法指定的回调函数,处理这个错误。大多少情况下catch方法和then里第二个回调二选一,then里第二个回调的优先级大于catch里的回调优先级 除此特性外,当resolve回调和reject回调中有语法错误,也会执行catch回调方法,并且将错误信息当成参数。

const promise = new Promise(function (resolve, reject) {
    setTimeout(() => {
        resolve('ok');
    }, 1000)
});
promise.then(function (res) {
    console.log("resolve", res)
    // 错误语法
    console.log(xx)
}, function (err) {
    console.log("reject", err)
    return xx
}).catch(function (res) {
    console.log('catch', res)
})

// resolve ok
// catch ReferenceError: xx is not defined

如果我们不设置catch(),当遇到错误时Promise错误,异常会触发到全局window上,报错导致程序终止,就是说自己的错误自己承担一下,处理一下,不会影响到公司,如果自己不管,影响到公司,最终公司倒闭了,你也失业了

finally

finally()方法不管 Promise 对象最后状态变成成功还是失败,都会执行的操作。一般用在处理异步请求的loading状态恢复,不管这次请求成功了,还是失败了,都得把loading去掉,别影响用户下次点击

const promise = new Promise(function (resolve, reject) {
    setTimeout(() => {
        resolve('ok');
    }, 1000)
});
promise.then(function (res) {
    console.log("resolve", res)
    // 错误语法
    console.log(xx)
}, function (err) {
    console.log("reject", err)
    return xx
}).finally(function () {
    console.log('finally', '取消loading')
})
// resolve ok
// finally 取消loading
// 还有报错

const promise = new Promise(function (resolve, reject) {
    setTimeout(() => {
        resolve('ok');
    }, 1000)
});
promise.then(function (res) {
    console.log("resolve", res)
    // 错误语法
    console.log(xx)
}, function (err) {
    console.log("reject", err)
    return xx
}).catch(function(){
    console.log('意料之中')
}).finally(function () {
    console.log('finally', '取消loading')
})

//resolve ok
// 意料之中
// finally 取消loading