Promise

141 阅读1分钟

promise的基本概念和用法

  • 什么是promise?

promise(承诺)包含三种状态pending(待定),resolved(已解决的),rejected(拒绝的)

  • 创建一个promise
let haveMoney = false; // 草,我没有钱
let willBuyHome = new Promise((resolve, reject) => {
    if (haveMoney) {
        let home = {
            color = 'yellow',
            length = 2000
        };
        resolve(home) 
    } else {
        let reason = new Error('老子不开心呢')
        reject(reason)
    }
})
new Promise(function(resolve, reject) { ... }) // 大概语法

总结一下:当结果正确的时候,调用resovle方法,错误异常情况调用reject方法。

  • promise函数的使用

    /* ES5 */
        var askMe = function () {
            willBuyHome
                .then(function (fulfilled) {
                    // 有钱
                    console.log(fulfilled);
                })
                .catch(function (error) {
                    // 缺钱
                    console.log(error.message);
                });
        };
        askMe(); // 调用函数
    
    我们用promise实例的.then和.catch方法来处理Promise中resovled和rejected
    
  • promise 的串联

    我们可以用Promise.resolve(param)和Promise.reject(param)来简化上面的写法

    let requestInfo = (home) => {
        let message = `这座房子的颜色${home.color},这座房子长度为${home.length}`;
        return Promise.resolve(message)
    }
    

    看一下两个promise是如何实现串联的

    let combainaFun = () {
        willBuyHome
        .then(requestInfo) // 传入第二个函数,串联
        .then((mes) => {
            console.log(msg)
            // output: '这座房子的颜色yellow,这座房子的长度为2000'
            .catch((error) => {
                console.log(error)
                // output error
            })
        })
    }
    
  • es7看着更舒服的异步写法

async function combainaFun() {
    try {
        let home = await willBuyHome(); 
        let message = await requestInfo(home); // 第一步结果赋值给第二个异步函数,体现了
        // 同步写法。
        console.log(message)
    } catch (error) {
        console.log(error.message || '服务器有点忙')
    }
    
}
  • 用promise的原因

    promise帮我们解决了异步程序中,回调函数必须作为参数(俗称的回调地狱问题),逻辑更清晰