从零开始认识promise

50 阅读3分钟

首先看看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