摘要:代碼結(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
摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書了入門,覺(jué)得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開(kāi)發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...
前言 今天就簡(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...
摘要:那之前的例子來(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)入門》或...
摘要:就算改變已經(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è)浪...
摘要:從最開(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...
閱讀 1148·2021-11-24 10:43
閱讀 3102·2021-11-22 09:34
閱讀 3549·2021-10-08 10:04
閱讀 3932·2021-09-23 11:58
閱讀 3115·2019-08-30 15:44
閱讀 483·2019-08-30 13:01
閱讀 1155·2019-08-28 18:07
閱讀 1448·2019-08-26 13:42