摘要:上面的代碼指定了兩個回調(diào)函數(shù),第一個回調(diào)函數(shù)完成以后,會將結(jié)果作為參數(shù)傳入到第二個回調(diào)函數(shù)。對進行處理捕捉錯誤方法其實是對的調(diào)用,用于指定發(fā)生錯誤時的回調(diào)函數(shù)。
Promise對象是一種異步編程的解決方案,比傳統(tǒng)的解決方案——會掉函數(shù)和事件——更合理和強大。
Promise有三種狀態(tài):pending(進行中)、Resolved(Fulfilled,已完成)和Rejected(已失敗);而且狀態(tài)一旦改變,就不會再發(fā)生改變,Promise對象的狀態(tài)只有兩種可能:從Pending變?yōu)镽esolved和從Pending變?yōu)镽ejected。只要這兩種情況發(fā)生了,狀態(tài)就凝固了,不會再變了。Promise有一些缺點,就是無法取消,一旦新建它就會執(zhí)行,無法中途取消;其次如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯誤,不會反應(yīng)到外部;第三Pending狀態(tài)時,無法得知目前進展到哪一個階段。
Promise構(gòu)造函數(shù)接受一個函數(shù)作為參數(shù),該函數(shù)參數(shù)分別是resolve和reject方法。如果成功,則用resolve將Promise的狀態(tài)改為成功,即從Pending變?yōu)閞esolved;如果異步失敗,則從Pending改為rejected。
基本用法
var promise = new Promise(function(resolve, reject){ if(/*異步操作成功*/){ resolve(value); } else{ reject(error); } }); promise.then(function(value){ //success }, function(value){ //failure });
一個簡單實用的例子
function timeout(ms){ return new Promise((resolve) => { setTimeout(resolve, ms); }); } timeout(100).then(()=>{ console.log("done"); })
如果用Promise對象實現(xiàn)Ajax操作
var getJSON = function(url){ var promise = new Promise(function(resolve, reject){ var client = new XMLHttpRequest(); client.open("GET", url); client.onreadystatechange = handler; client.responseType = "json"; client.setRequestHeader("Accept", "application/json"); client.send(); function handler(){ if(this.status == 200){ resolve(this.response); }else { reject(new Error(this.statusText)); } } return promise; }) } getJSON("/posts.json").then(function(json){ console.log("Contents:" + json); }, function(error){ console.error("出錯了", error); })
在resolve的方法參數(shù)除了正常值以為,還可以能是另一個Promise實例。
Promise的鏈?zhǔn)讲僮鳎篜romise.prototype.thenPromise.prototype.then返回的是一個新的Promise對象,因此可以寫成鏈?zhǔn)降摹?/p>
getJSON("/posts.json").then(function(json){ return json.post; }).then(function(){ //proceed })
上面的代碼指定了兩個回調(diào)函數(shù),第一個回調(diào)函數(shù)完成以后,會將結(jié)果作為參數(shù)傳入到第二個回調(diào)函數(shù)。
如果第一個回調(diào)函數(shù)返回的是Promise對象,這樣后一個函數(shù)調(diào)用就將等待該Promise對象有了運行結(jié)果,才會進一步調(diào)用。
getJSON("/post/1.json").then(function(post){ return getJSON(post.commentURL); }).then(function(comments){ //對comments進行處理 })捕捉錯誤:Promise.prototype.catch方法
Promise.prototype.catch其實是對Promise.prototype.then(null, rejection)的調(diào)用,用于指定發(fā)生錯誤時的回調(diào)函數(shù)。
Promise.prototype.catch 對錯誤具有“冒泡”性質(zhì),會一直向后傳遞,直到被捕獲,也就是錯我總是被下一個catch語句捕獲。
getJSON("/post/1.json").then(function(post) { return getJSON(post.commentURL); }).then(function(comments) { // some code }).catch(function(error) { // 處理前兩個回調(diào)函數(shù)的錯誤 });Promise.all方法
var p = Promise.all([p1,p2,p3]);
這個方法接受一個數(shù)組作為參數(shù),p1,p2,p3都是Promise對象的實例。p的最終狀態(tài)取決于參數(shù)對象數(shù)組的狀態(tài),上例中就是p1,p2,p3來決定的。如果這三個都是fulfilled,那么p的狀態(tài)就是fulfilled;如果p1,p2,p3中有一個是rejected,p的狀態(tài)就是rejected.那么p的狀態(tài)就是reject,會傳遞給p的回調(diào)函數(shù)。
// 生成一個Promise對象的數(shù)組 var promises = [2, 3, 5, 7, 11, 13].map(function(id){ return getJSON("/post/" + id + ".json"); }); Promise.all(promises).then(function(posts) { // ... }).catch(function(reason){ // ... });Promise.resolve方法,Promise.reject方法
將現(xiàn)有對象轉(zhuǎn)我Promise對象,Promise.resolve方法就起到這個作用。
var jsPromise = Promise.resolve($.ajax("/whatever.json"));
上面jQuery生成defferred對象,轉(zhuǎn)為一個新的ES6的Promise對象。
如果Promise.resolve方法的參數(shù),不具有then方法的對象(又稱thenable對象),則返回一個新的Promise對象,且他的狀態(tài)為fulfilled.
var p = Promise.resolve("Hello"); p.then(function(s){ console.log(s) }) //Hello
上面生成一個新的Promise對象的實例p,它的狀態(tài)為fulfilled。
Promise.reject(reason)方法也會返回一個新的Promise實例,該實例的狀態(tài)為rejected,Promise.reject方法的參數(shù)reason,會被傳遞給實例的回調(diào)函數(shù)。
async函數(shù)是用來取代回調(diào)函數(shù)的另一種方法。只要函數(shù)之前加上async的關(guān)鍵字,就表明該函數(shù)內(nèi)部有異步操作。該異步操作返回一個Promise對象,前面用await關(guān)鍵字注明。當(dāng)函數(shù)執(zhí)行的時候,一旦遇到await就立馬返回,等接觸到異步操作完成,再接著執(zhí)行函數(shù)體內(nèi)后面的語句。
async function getStockPrice(symbol, currency) { let price = await getStockPrice(symbol); return convert(price, currency); }
函數(shù)前面加了一個async表明該函數(shù)將返回一個Promise對象,調(diào)用該函數(shù)時,遇到await關(guān)鍵字,立刻返回后面的表達式產(chǎn)生的Promise對象,不再執(zhí)行函數(shù)體后面的語句。等getStockPrice完成,在自動回到函數(shù)體內(nèi),執(zhí)行剩下的語句。
function timeout(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } async function asyncValue(value) { await timeout(50); return value; }
上面代碼中,asyncValue函數(shù)前面有async關(guān)鍵字,表明函數(shù)體內(nèi)有異步操作。執(zhí)行的時候,遇到await語句就會先返回,等到timeout函數(shù)執(zhí)行完畢,再返回value。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/81820.html
摘要:的幾個擴展總結(jié)描述和相反,當(dāng)所有的被拒絕之后,方法執(zhí)行完成的決議,如果存在一個執(zhí)行完成的決議,方法則執(zhí)行拒絕里邊的所有實例反過來就好了執(zhí)行到此執(zhí)行到此描述忽略被拒絕的,只需要有一個完成的,方法就執(zhí)行完成操作,如果全部的都被拒絕,方法執(zhí)行拒絕 Promise的幾個擴展API總結(jié) 1. Promise.none 描述: 和 Promise.all 相反,當(dāng)所有的promise被拒絕之后,n...
摘要:構(gòu)造函數(shù)的實現(xiàn)我們在使用的時候其實是使用關(guān)鍵字創(chuàng)建了一個的實例,其實是一個類,即構(gòu)造函數(shù),下面來實現(xiàn)構(gòu)造函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000018998456); 閱讀原文 概述 Promise 是 js 異步編程的一種解決方案,避免了 回調(diào)地獄 給編程帶來的麻煩,在 ES6 中成為了標(biāo)準(zhǔn),這篇文章重點不是敘...
摘要:使用對象的好處在于可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調(diào)函數(shù)。對象異步操作拋出錯誤,狀態(tài)就會變?yōu)?,就會調(diào)用方法指定的回調(diào)函數(shù)處理這個錯誤。 Promise 含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強大。它由社區(qū)最早提出和實現(xiàn),ES6 將其寫進了語言標(biāo)準(zhǔn),統(tǒng)一了用法,原生提供了 Promise 對象。 所謂 P...
摘要:對于的來說基元函數(shù)包括組合函數(shù)的類型簽名返回情況完成如果傳入的可迭代對象為空,會同步地返回一個已完成狀態(tài)的。相反,如果是在指定的時間之后完成,剛返回結(jié)果就是一個拒絕狀態(tài)的從而觸發(fā)方法指定的回調(diào)函數(shù)。在行中,對每個小任務(wù)得到的結(jié)果進行匯總。 為了保證的可讀性,本文采用意譯而非直譯。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 從ES6 開始,我們大都使用的是 P...
摘要:使用是極好的,它是如此有用以至于我覺得應(yīng)該好好研究一下,甚至是實現(xiàn)一個簡易的版本。構(gòu)造函數(shù)檢查參數(shù)例如是不是函數(shù)啊初始化,創(chuàng)建對象執(zhí)行因此構(gòu)造函數(shù)里面?zhèn)魅氲氖橇⒓幢粓?zhí)行的。 使用Promise是極好的,它是如此有用以至于我覺得應(yīng)該好好研究一下Promise,甚至是實現(xiàn)一個簡易的版本。實現(xiàn)之前,我們先來看看Promise的用途: 使用Promise callback hell Promi...
摘要:寫在前面這一章的順序?qū)τ谖唇佑|過使用過的童鞋而言略抽象了,前邊幾章主要為了說明和之前的異步方式相比有什么優(yōu)勢和它能解決什么問題,后邊才詳解的設(shè)計和各種場景下如何使用。建議先了解和簡單使用過后再閱讀,效果更佳。 寫在前面:Promise這一章的順序?qū)τ谖唇佑|過使用過Promise的童鞋而言略抽象了,前邊幾章主要為了說明Promise和之前的異步方式相比有什么優(yōu)勢和它能解決什么問題,后邊才...
閱讀 2749·2021-11-24 09:39
閱讀 3400·2021-10-09 09:53
閱讀 1282·2021-09-22 16:06
閱讀 4659·2021-09-02 10:18
閱讀 961·2021-08-23 09:42
閱讀 1940·2021-08-17 10:11
閱讀 2831·2019-08-30 13:02
閱讀 2260·2019-08-30 12:49