这是我参与「第四届青训营 」笔记创作活动的的第16天.
在和小伙伴讨论的过程中发现JavaScript高级语法中promise的使用是个难点,于是在此记录一下目前对promise的浅显的理解,此为上篇。
Promise 是JS中一种处理异步操作的机制, axios.get(...).then(res => {...});用于异步请求的 axios 返回的就是一个 Promise 对象。
平时一直在代码中 .then() .catch() 地写来写去,终于决-定要认真学一学这个 Promise 到底是怎么回事,希望这篇学习笔记也能帮到你。
Promise 对象
一个 Promise 对象表示一个异步操作的执行结果,包括状态(成功/失败)和值(成功返回值/错误原因)。
Promise 对象的状态
Pending 待定: 刚创建时的初始状态,还没有确定执行结果
Fulfilled 已兑现: 异步操作执行成功,并返回一个值
Rejected 已拒绝: 异步操作执行失败,并返回一个错误原因
Settled 已敲定 / Resolved 已决议:“待定”状态的反面,都表示异步操作已经执行完成,即已兑现或已拒绝
回调函数
如果完全不关心异步操作的执行结果,那就把它放在那自己执行就可以了;但通常情况下我们总是要对操作执行的结果进行后续处理的,例如更改页面上的数据显示、错误处理等。但由于异步操作不知道什么时候可以执行完成,就出现了 “回调函数” 的概念,意思就是等到异步操作处理结束了,再回过头来调用这个函数来对执行结果进行处理。
传统做法是,在执行异步操作的时候就把回调函数作为参数传进去,比如最常见的:
setTimeout(function(){
console.log("成功!");
}, 250);
setTimeout() 函数是最常见的异步函数之一,众所周知它的作用就是在指定时间后执行指定代码。仔细看就会发现,setTimeout() 函数接收两个参数,第二个参数是等待时间,而第一个参数就是回调函数,即等待指定的时间之后要回来调用这个函数。
这种传参的做法有很多不方便的地方,比如把对结果的后续处理和异步操作本身耦合在了一起,以及著名的回调地狱: 在回调地狱中代码不断横向发展,不利于维护,于是就有了promise的then写法,让代码优雅地向下发展。
Promise.then() 绑定回调函数
有了 Promise 之后,就能把回调和异步操作本身分开了。无论一个 Promise 对象当前是否已经执行完毕, 我们都能在它上面绑定回调函数,并且保证回调函数被执行;这就是喜闻乐见的 then() 方法。
p.then(onFulfilled[, onRejected]);
p.then(value => {
// fulfillment
}, reason => {
// rejection
});
then() 方法的语法很简单,有两个可选参数,分别代表当 Promise 的状态变为成功(fulfilled)和失败(rejected)时所使用的回调函数。
如果只想绑定 onRejected(即失败时的错误处理函数),下面两种写法完全等价,第二种是第一种的简写形式。
p.then(null, failureCallback);
p.catch(failureCallback);
感想
promise的异步操作涵盖了JavaScript精华知识点,关于面向对象和回调,要继续精进前端开发的技术,需要继续进修JavaScript高级语法。笔者目前除了参加青训营的课程外,还在研读前端红宝书——《JavaScript高级程序设计》,希望能够让自己写的代码更精简美观。