首先看看promise的基本用法
let p = new Promise((resolve, reject) => {
let money = +prompt('填入月薪')
if (money >= 10000) {
// 表示此时成功——》调用resolve,传入成功的结果
resolve('月薪过万!')
} else {
// 表示此时失败了——》调用reject,传入失败的结果
reject('没钱!')
}
})
一、promise是什么?
promise是一个构造函数,单词的含义是承诺,new一个promise就相当于许下一个诺言,既然是诺言就有成功和失败两种情况,诺言不可能有既成功又失败的情况,所以promise也只有三种状态,即pending(进行中)、fulfilled(已成功)、rejected(已失败),一旦由pending(进行中)转变成fulfilled(已成功)或rejected(已失败)就会将状态固定不会再改变。
二、如何使用promise
promise本身就是一个构造函数,按照构造函数的使用方法写即可
let p = new Promise()
其中要写一个回调函数
let p = new Promise(() => {})
回调函数要传两个形参,这两个参数都是固定的,第一个是resolve(成功结果),第二个是reject(失败的结果)
let p = new Promise((resolve, reject) => {})
那么,这两个参数要如何使用呢?
let p = new Promise((resolve, reject) => {
//可以在此处做一个判断,这段代码表示声明一个名为money的变量用以收集用户填入的数据
let money = +prompt('填入月薪')
//对数据进行判断,如果为true或者false分别有何情况
if (money >= 1000) {
// 表示此时成功了,resolve(这里写入成功时要做的事)
resolve('月薪过万!')
} else {
// 表示此时失败了,reject(这里写入失败时要做的事)
reject('没钱!')
}
})
写到这里可能会有疑惑,虽然我确实写了成功或失败要做的事,但是我如何才能知道结果呢? 其实,我们可以通过.then()与.catch()来获取诺言的结果
p
.then((res) => {
// .then(获取成功的结果)
console.log(res)
})
.catch((err)=>{
// .catch(获取失败的结果)
console.log(err)
})
以上就是promise的基本用法了
三、promise的优缺点
promise的优点是可以解决回调地狱的问题,也就是回调函数的嵌套问题
// 链式编程
// 需求:延时2s秒输出红色,然后再延时1s输出黄色,然后再延时3s输出绿色
// 回调函数的嵌套 ==> 回调地狱
setTimeout(function () {
console.log('红色')
setTimeout(function () {
console.log('黄色')
setTimeout(function () {
console.log('绿色')
}, 3000)
}, 1000)
}, 2000)
怎么样,上面这串代码不仅阅读性不好,维护起来也是非常麻烦,因此我们可以用promise来解决这个问题 ,还是以上面这串代码为例
// 封装创建promise实例的函数
function fn(txt, time) {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve(txt)
}, time)
})
}
fn('红色', 2000)
.then(res => {
console.log(res)
return fn('黄色', 1000)
})
.then(res => {
console.log(res)
return fn('绿色', 3000)
})
.then(res => {
console.log(res)
})
这样就大大增加了代码的可阅读性,维护起来也方便许多。
至于promise的缺点嘛,可能就是理解起来麻烦一点吧,虽说代码量没有减少,但是对于后续的工作还是很有帮助的,代码的好坏在于能否令人看懂,写成一坨谁都不会喜欢的。
四、promise的使用场景
promise有两种使用场景 ,一种是解决回调地狱, 另一种是用来封装异步操作
五、promise的底层原理
promise底层上实际使用了axios