promise async/await

箭頭函數(shù)

普通函數(shù) 簡寫 就是 箭頭函數(shù)

    //普通匿名函數(shù)
    const aa = function(param1,param2){
        console.log(param1)
        console.log(param2)
    }
    //改成箭頭函數(shù)
    const bb = (param1,param2) => {
        console.log(param1)
        console.log(param2)
    }
    //如果只有一個參數(shù)
    const cc = (param1) => {
        console.log(param1)
    }
    //一個參數(shù)可以省去括號
    const cc2 = param1 => {
        console.log(param1)
    }
    //沒有參數(shù)
    const dd = () => {
        console.log('====')
    }
    //方法體就一句話
    const ee = () => console.log('====')

正文

當(dāng)有多個接口需要順序調(diào)用時
順序調(diào)用是指 :接口1返回的數(shù)據(jù) ,作為請求接口2的參數(shù) ,接口2返回的數(shù)據(jù) ,又作為請求接口3的參數(shù)

普通ajax的寫法(回調(diào)地獄)

    $.ajax({
        url:'接口1',
        success:(res1)=>{
            console.log(res1)//得到結(jié)果1

            $.ajax({
                url:'接口2',
                data:res1,//結(jié)果1 作為 參數(shù)
                success:res2=>{
                    console.log(res2)//得到結(jié)果2

                    $.ajax({
                        url:'接口3',
                        data:res2,//結(jié)果2 作為 參數(shù)
                        success:res3=>{
                            console.log(res3)//得到結(jié)果3

                            //.....
                        }
                    })

                }
            })
        }
    })

promise寫法

promise基本用法
實例化時 new Promise(回調(diào)函數(shù)),傳入的參數(shù)是一個回調(diào)函數(shù)
這個回調(diào)函數(shù)有兩個參數(shù)分別是resolvereject
resolve 用來把 promise對象 變成 成功狀態(tài) ,并返回結(jié)果
reject 用來把 promise對象 變成 失敗狀態(tài) ,并返回結(jié)果

    //創(chuàng)建promise 實例
    let promiseObj = new Promise((resolve,reject)=>{
        let url = 'xxx.api'
        let data = {'id':1}
        $.ajax({
            url:url,
            data:data,
            success:res=>{
                if (res.code === 200){
                    resolve(res)
                }else{
                    reject('接口返回錯誤:'+res.msg)
                }
            },
        })
    })

promise實例 請求接口后,要么變?yōu)?成功狀態(tài) ,要么變?yōu)?失敗狀態(tài)

  1. 可以通過 .then() 方法設(shè)置 成功后的回調(diào) ,回調(diào)參數(shù)就是 promise內(nèi)部 通過resolve()方法 返回的參數(shù)
  2. 可以通過 .catch() 方法設(shè)置 失敗后的回調(diào) ,回調(diào)參數(shù)就是 promise內(nèi)部 通過reject()方法 返回的參數(shù)
    promiseObj
        .then(
            res1 => {
                console.log(res1)//res1 就是 promise內(nèi)部 resolve()的參數(shù) 
            }
        )
        .catch(
            e => {
                console.log(e)//e 就是 promise內(nèi)部 reject()的參數(shù)
            }
        )

通常的用法是封裝一個方法request(url,params) 用來獲取promise對象
傳入接口地址參數(shù)就能得到一個promise對象

    //封裝一個獲取Promise對象的方法
    const request = (url,params) => {
        return new Promise(
            (resolve,reject) => {
                $.ajax({
                    url:url,
                    data:params,
                    success:res=>{
                        if (res.code === 200){
                            resolve(res)
                        }else{
                            reject('接口返回錯誤:'+res.msg)
                        }
                    }
                })
            }
        )
    }

promise 鏈?zhǔn)秸{(diào)用

需要在第一個.then()設(shè)置的回調(diào)內(nèi) return 一個新的promise對象

    request('接口1',{})
        .then(res1=>{
            console.log(res1)//得到結(jié)果1

            return request('接口2',res1) //結(jié)果1 作為 參數(shù)
        })
        .then(res2=>{
            console.log(res2)//得到結(jié)果2
            return request('接口3',res2)//結(jié)果2 作為 參數(shù)
        })
        .then(res3=>{
            console.log(res3)//得到結(jié)果3

            //......
        })

sync await

promise.then() 鏈?zhǔn)秸{(diào)用的方式 相比于 普通ajax()回調(diào)地獄 ,有了很大的改進(jìn)
但是一連串的的.then().then().then()看上去也不方便
改成 asyncawait方式
await 必須出現(xiàn)在 async 聲明的方法內(nèi)部 ,不能單獨(dú)出現(xiàn)


    //test 方法 用async聲明 ,調(diào)用test() 返回的就是一個promise對象 
    const test = async () => {
        //request('接口1') 返回的是一個promise對象 
        //用await聲明后 , await request('接口1') 返回值就是內(nèi)部resolve()的參數(shù) 
        //不需要.then() 就能直接拿到接口返回的數(shù)據(jù)
        //并且await 聲明的請求會阻塞后邊的執(zhí)行
        let res1 = await request('接口1')
        console.log(res1)//得到結(jié)果1

        //由于await 聲明了 request('接口1') ,這里會被第一個請求阻塞
        let res2 = await request('接口2',res1)//結(jié)果1 作為 參數(shù)
        console.log(res2)//得到結(jié)果2

        let res3 = await request('接口3',res2)//結(jié)果2 作為 參數(shù)
        console.log(res3)//得到結(jié)果3
    }

    //調(diào)用test() ,由于async聲明 ,這里test() 返回的也是promise對象 
    //所以可以用 .catch() 方法
    test().catch(e => console.log("接口1,接口2,接口3中 ,任何一個reject() 都能被捕獲") )

我是個干后端的 ,上邊有不對的地方請標(biāo)明

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末州叠,一起剝皮案震驚了整個濱河市着绷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖掏缎,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贼陶,居然都是意外死亡饵沧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門潦俺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拒课,“玉大人,你說我怎么就攤上這事事示≡缦瘢” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵肖爵,是天一觀的道長卢鹦。 經(jīng)常有香客問我,道長劝堪,這世上最難降的妖魔是什么冀自? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮秒啦,結(jié)果婚禮上熬粗,老公的妹妹穿的比我還像新娘。我一直安慰自己余境,他們只是感情好荐糜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般暴氏。 火紅的嫁衣襯著肌膚如雪延塑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天答渔,我揣著相機(jī)與錄音关带,去河邊找鬼。 笑死沼撕,一個胖子當(dāng)著我的面吹牛宋雏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播务豺,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼磨总,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笼沥?” 一聲冷哼從身側(cè)響起蚪燕,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奔浅,沒想到半個月后馆纳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汹桦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年鲁驶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞骆。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡钥弯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出督禽,到底是詐尸還是另有隱情寿羞,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布赂蠢,位于F島的核電站绪穆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虱岂。R本人自食惡果不足惜玖院,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望第岖。 院中可真熱鬧难菌,春花似錦、人聲如沸蔑滓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至燎窘,卻和暖如春摹闽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褐健。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工付鹿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚜迅。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓舵匾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谁不。 傳聞我的和親對象是個殘疾皇子坐梯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 回調(diào)地獄 回調(diào)地獄嵌套多個方法調(diào)用會創(chuàng)建錯綜復(fù)雜的代碼吵血,會難以理解與調(diào)試。當(dāng)想要實現(xiàn)更復(fù)雜的功能時轩拨,回調(diào)函數(shù)也會存...
    Inlight先森閱讀 2,801評論 0 4
  • 背景 JavaScript是單線程工作喷舀,這意味著兩段腳本不能同時運(yùn)行砍濒,而且必須一個接一個的運(yùn)行。 其實JavaSc...
    小_灰_灰_閱讀 407評論 0 0
  • 前言 Promise async generator是ES6之后才被提出來的硫麻,他們都能夠用來解決以前JS異步調(diào)用產(chǎn)...
    _玖柒_閱讀 617評論 0 4
  • 不多說爸邢,這2個都是寫異步的沒毛病。 長期用拿愧,但從未系統(tǒng)梳理過杠河,所以特此將它們的用法原理都整理下。下邊我會先梳理它們...
    南山碼僧閱讀 324評論 0 1
  • 為什么會有同步和異步浇辜? 首先JS 是單線程的券敌,單線程程序在執(zhí)行的時候,所有的程序都是按照順序執(zhí)行的柳洋,前面的必須處理...
    書蟲和泰迪熊閱讀 481評論 0 1