国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

總結(jié)一下ES6的promise

Bowman_han / 2352人閱讀

摘要:代碼結(jié)果是原因是或者中一個(gè)對(duì)象并不會(huì)拋出錯(cuò)誤,而是通過(guò)來(lái)處理的,所以不會(huì)被后續(xù)的捕獲,需要改成其中一種方法方法是的語(yǔ)法糖,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。

基本用法

promise有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失敗),Promise構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù),該函數(shù)的兩個(gè)參數(shù)分別是resolve和reject,其中resolve函數(shù)會(huì)將pending狀態(tài)改為fulfilled,reject函數(shù)將pending改為rejected狀態(tài),狀態(tài)一旦改變,將不可逆。這兩個(gè)函數(shù)的函數(shù)的參數(shù)將會(huì)傳給回調(diào)函數(shù)

const promise = new Promise(function(resolve, reject) {
        // ... some code

        if (/* 異步操作成功 */){
            resolve(value);
        } else {
            reject(error);
        }
    });
    promise.then((value)=>{ 
        console.log(value)
    },(error)=>{
        console.log(error)
    })
then方法

Promise實(shí)例生成以后,可以用then方法分別指定resolved狀態(tài)和rejected狀態(tài)的回調(diào)函數(shù),第一個(gè)是狀態(tài)由pending->fulfilled的回調(diào),第二個(gè)是pending->resolved的回調(diào)。
then為什么可以進(jìn)行鏈?zhǔn)秸{(diào)用呢?原因就是then方法返回的也是一個(gè)promise對(duì)象,所以后面可以繼續(xù)使用then()方法。
此處有個(gè)地方需要注意,著重理解下面這句話:
Values returned from the onFulfilled or onRejected callback functions will be automatically wrapped in a resolved promise.
then()的兩個(gè)參數(shù)函數(shù)中返回的值,會(huì)自動(dòng)包裝成一個(gè)已resolved的promise。
代碼1:

$http({
            method: "GET",
            url: "https://www.runoob.com/try/angularjs/data/sites.php1"
        }).then(function successCallback(data_1) {
            $scope.res = data_1;
            $scope.names = data_1.data.sites;
            return data_1;
        },function (err_1) {
            console.log("err_1",err_1);
            return err_1;
        }).then(function (data_2) {
            console.log("data_2", data_2)
        },function (err_2) {
            console.log("err_2---->",err_2);
        }).catch(function (reason) {
            console.log("err------->",reason);
        });

注:$http返回的是一個(gè)promise對(duì)象。
結(jié)果如下:

網(wǎng)絡(luò)請(qǐng)求404->失敗的回調(diào)函數(shù)err_1方法->成功的回調(diào)函數(shù)(why),原因就是then中的回調(diào)函數(shù),無(wú)論是成功回調(diào)還是失敗回調(diào),他們r(jià)eturn的值都會(huì)被包裝成promise的對(duì)象的resolved函數(shù)來(lái)處理,從而會(huì)傳遞給下一個(gè)then方法的成功回調(diào)函數(shù)里面去。
代碼2:

Promise.resolve()
        .then(() => {
            return new Error("error!!!")
        })
        .then((res) => {
            console.log("then: ", res)
        })
        .catch((err) => {
            console.log("catch: ", err)
        })

結(jié)果是:

then: Error: error!!!
at Promise.resolve.then (...)
at ...

原因是:.then 或者 .catch 中 return 一個(gè) error 對(duì)象并不會(huì)拋出錯(cuò)誤,而是通過(guò)resolved來(lái)處理的,所以不會(huì)被后續(xù)的 .catch 捕獲,需要改成其中一種:

1.return Promise.reject(new Error("error!!!"))
2.throw new Error("error!!!")
catch方法

Promise.prototype.catch方法是.then(null, rejection)的語(yǔ)法糖,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。
1.then方法中沒(méi)有第二個(gè)失敗回調(diào)函數(shù),當(dāng)reject后,會(huì)進(jìn)入catch方法;若then方法有第二個(gè)失敗
回調(diào),則reject后會(huì)進(jìn)入此函數(shù),而不會(huì)進(jìn)入catch方法。

$http({
            method: "GET",
            url: "https://www.runoob.com/try/angularjs/data/sites.php"
        }).then(function successCallback(data_1) {
            $scope.res = data_1;
            $scope.names = data_1.data.sites;
            return data_1;
        },function (err_1) {
            console.log("err_1",err_1);
            return err_1;
        }).catch(function (reason) {
            console.log("err------->",reason);
        });

結(jié)果:

當(dāng)沒(méi)then有第二個(gè)回調(diào)函數(shù),則會(huì)進(jìn)入catch方法。
小疑問(wèn):catch方法中return一個(gè)數(shù)值,在其后面的.then()的成功回調(diào)中會(huì)接收到么?答案是會(huì)的,把catch看做成沒(méi)有成功回到的.then(),其return的數(shù)值也會(huì)被resolved出去。
注意:不要在then方法里面定義 Reject 狀態(tài)的回調(diào)函數(shù)(即then的第二個(gè)參數(shù)),總是使用catch方法。理由是第二種寫法可以捕獲前面then方法執(zhí)行中的錯(cuò)誤,也更接近同步的寫法(try/catch)

// bad
promise
  .then(function(data) {
    // success,標(biāo)記1.要是在此處代碼拋出了錯(cuò)誤,此then函數(shù)的失敗回調(diào)函數(shù)是捕捉不到的。
  }, function(err) {
    // error
  });

// good
promise
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error
  });

即:如果在“標(biāo)記1”出代碼拋出錯(cuò)誤,后面的失敗回調(diào)函數(shù)是捕捉不到的(只能捕捉上一個(gè)promise對(duì)象拋出的錯(cuò)誤,自己所處在的then中是捕捉不到的),而只能被下一個(gè)then函數(shù)的失敗回調(diào)(也就是catch)捕捉到。
例子:

Promise.resolve()
        .then(function success (res) {
            throw new Error("error")
        }, function fail1 (e) {
            console.error("fail1: ", e)
        })
        .catch(function fail2 (e) {
            console.error("fail2: ", e)
        })
    

結(jié)果:

fail2: Error: error
at success (...)
at ...

.then 可以接收兩個(gè)參數(shù),第一個(gè)是處理成功的函數(shù),第二個(gè)是處理錯(cuò)誤的函數(shù)。.catch 是 .then 第二個(gè)參數(shù)的簡(jiǎn)便寫法,但是它們用法上有一點(diǎn)需要注意:.then 的第二個(gè)處理錯(cuò)誤的函數(shù)捕獲不了第一個(gè)處理成功的函數(shù)拋出的錯(cuò)誤,而后續(xù)的 .catch 可以捕獲之前的錯(cuò)誤
以下代碼也可以:

Promise.resolve()
        .then(function success1 (res) {
            throw new Error("error")
        }, function fail1 (e) {
            console.error("fail1: ", e)
        })
        .then(function success2 (res) {
        }, function fail2 (e) {
            console.error("fail2: ", e)
        })

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94764.html

相關(guān)文章

  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書了入門,覺(jué)得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開(kāi)發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評(píng)論0 收藏0
  • ES6精解:promise用法

    前言 今天就簡(jiǎn)單總結(jié)一下promise的用法,在用promise之前,我們要先了解一下什么promise,這個(gè)東西是用來(lái)干什么的? 通俗易懂的講,promise其實(shí)就是一個(gè)構(gòu)造函數(shù),是用來(lái)解決異步操作的,我們平時(shí)其實(shí)還是會(huì)用到挺多的,比如我們經(jīng)常會(huì)嵌套一層層的函數(shù) step1(function (value1) { step2(value1, function(value2){ s...

    enali 評(píng)論0 收藏0
  • ES6常用知識(shí)點(diǎn)概述

    摘要:那之前的例子來(lái)使用一下的話,你會(huì)發(fā)現(xiàn)瀏覽器報(bào)錯(cuò)了,如圖定義的變量不允許二次修改。如圖箭頭函數(shù)沒(méi)有它自己的值,箭頭函數(shù)內(nèi)的值繼承自外圍作用域。如圖這里兩邊的結(jié)構(gòu)沒(méi)有一致,如果是的話,是可以正常解構(gòu)的。 前言 國(guó)慶假期已過(guò)一半,來(lái)篇干貨壓壓驚。 ES6,并不是一個(gè)新鮮的東西,ES7、ES8已經(jīng)趕腳了。但是,東西不在于新,而在于總結(jié)。每個(gè)學(xué)前端的人,身邊也必定有本阮老師的《ES6標(biāo)準(zhǔn)入門》或...

    keithyau 評(píng)論0 收藏0
  • ES6Promise:要優(yōu)雅,也要浪漫

    摘要:就算改變已經(jīng)發(fā)生了,即使再對(duì)對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。方法接收個(gè)參數(shù),第一個(gè)參數(shù)是狀態(tài)的回調(diào)函數(shù),第二個(gè)參數(shù)可選是狀態(tài)的回調(diào)函數(shù)。簡(jiǎn)單來(lái)講,就是能把原來(lái)的回調(diào)寫法分離出來(lái),在異步操作執(zhí)行完后,用鏈?zhǔn)秸{(diào)用的方式執(zhí)行回調(diào)函數(shù)。 在ECMAScript 6標(biāo)準(zhǔn)中,Promise被正式列為規(guī)范,Promise,字面意思就是許諾,承諾,嘿,聽(tīng)著是不是很浪漫的說(shuō)?我們來(lái)探究一下這個(gè)浪...

    weizx 評(píng)論0 收藏0
  • JS筆記

    摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁(yè)面加載發(fā)生了什么這是一篇開(kāi)發(fā)的科普類文章,涉及到優(yōu)化等多個(gè)方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識(shí)之 HTTP 協(xié)議 詳細(xì)介紹 HTT...

    rottengeek 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<