初级promise

163 阅读2分钟

Promise 的含义

Promise是异步编程的一种解决方案,它有三种状态,分别是pending-进行中、resolved-已完成、rejected-已失败

当Promise的状态又pending转变为resolved或rejected时,会执行相应的方法,并且状态一旦改变,就无法再次改变状态,这也是它名字promise-承诺的由来

Promise的基本用法

    // 方法1
    let promise = new Promise ( (resolve, reject) => {
        if ( success ) {
            resolve(a) // pending ——> resolved 参数将传递给对应的回调方法
        } else {
            reject(err) // pending ——> rejectd
        }
    } )

    // 方法2
    function promise () {
        return new Promise ( function (resolve, reject) {
            if ( success ) {
                resolve(a)
            } else {
                reject(err)
            }
        } )
    }

链式操作的用法

从表面上看,Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:


    runAsync1()
    .then(function(data){
        console.log(data);
        return runAsync2();
    })
    .then(function(data){
        console.log(data);
        return runAsync3();
    })
    .then(function(data){
        console.log(data);

catch的用法

我们知道Promise对象除了then方法,还有一个catch方法,它是做什么用的呢?其实它和then的第二个参数一样,用来指定reject的回调,用法是这样

        
    getSomething()
    .then(function(data){
        console.log('resolved');
        console.log(data);
    })
    .catch(function(reason){
        console.log('rejected');
        console.log(reason);

Promise的其他常见api

  • Promise.all()

    var promise = Promise.all( [p1, p2, p3] )
    promise.then(
        ...
    ).catch(
        ...
    )
    

    当p1、p2、p3的状态都变成resolved时,promise才会变成resolved,并调用then()的已完成回调,但只要有数组中有一个变成rejected状态,promise就会立刻变成rejected状态

  • Promise.race()

    var promise = Promise.race( [p1, p2, p3] )
    promise.then(
        ...
    ).catch(
        ...
    )
    

    “竞速”方法,参数与Promise.all()相同,不同的是,参数中的p1、p2、p3只要有一个改变状态,promise就会立刻变成相同的状态并执行对于的回调,相当于一次promise 赛跑