成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

20170702-異步編程之Promise

gecko23 / 1159人閱讀

摘要:異步操作成果異步操作失敗方法可以接受兩個(gè)回調(diào)函數(shù)作為參數(shù)。第一個(gè)回調(diào)函數(shù)完成以后,會(huì)將返回結(jié)果作為參數(shù),傳入第二個(gè)回調(diào)函數(shù)。等同于等同于這段代碼會(huì)讓這個(gè)對(duì)象立即進(jìn)入狀態(tài),并將錯(cuò)誤對(duì)象傳遞給指定的回調(diào)函數(shù)。

1.Promise的含義

Promise是異步編程的一種解決方案

Promise實(shí)例代表一個(gè)異步操作,從它可以獲取異步操作的消息

Promise實(shí)例有三種狀態(tài):

Pending:進(jìn)行中

Resolved:已完成

Rejected:已失敗

Promise實(shí)例的狀態(tài)只能由 Pending->ResolvedPending->Rejected。一旦Promise實(shí)例的狀態(tài)發(fā)生改變,就不會(huì)再發(fā)生變化,任何時(shí)候都可以得到這個(gè)結(jié)果

為什么要使用Promise:通過Promise,可以將一步操作以同步操作的流程表達(dá)出來,可以避免層層嵌套的回調(diào)函數(shù)(回調(diào)地域),并且Promise提供了統(tǒng)一的接口,使得控制異步操作更加容易

2.Promise構(gòu)造函數(shù)

Promise是一個(gè)構(gòu)造函數(shù),用來生成Promise實(shí)例

var promise = new Promise(function(resolve, reject)){
    // ... do something
    if (/*異步操作成果*/) {
        resolve(value)
    } else { /*異步操作失敗*/
        reject(error)
    }
}

Promise構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù),該函數(shù)的兩個(gè)參數(shù)分別是resolvereject。它們是兩個(gè)函數(shù),由 JavaScript 引擎提供,不用自己部署。

resolve函數(shù)的作用是,將Promise實(shí)例的狀態(tài)從“未完成”變?yōu)椤俺晒Α保磸?Pending 變?yōu)?Resolved),在異步操作成功時(shí)調(diào)用,并將異步操作的結(jié)果,作為參數(shù)傳遞出去

reject函數(shù)的作用是,將Promise實(shí)例的狀態(tài)從“未完成”變?yōu)椤笆 保磸?Pending 變?yōu)?Rejected),在異步操作失敗時(shí)調(diào)用,并將異步操作報(bào)出的錯(cuò)誤,作為參數(shù)傳遞出去**

Promise.prototype.then()

Promise實(shí)例生成以后,可以用then方法分別指定Resolved狀態(tài)和Reject狀態(tài)的回調(diào)函數(shù)。

var promise = new Promise(function(resolve, reject)){
    // ... do something
    if (/*異步操作成果*/) {
        resolve(value)
    } else { /*異步操作失敗*/
        reject(error)
    }
}
promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

then方法可以接受兩個(gè)回調(diào)函數(shù)作為參數(shù)。第一個(gè)回調(diào)函數(shù)是Promise的狀態(tài)變?yōu)?b>Resolved時(shí)調(diào)用,第二個(gè)回調(diào)函數(shù)是Promise實(shí)例的狀態(tài)變?yōu)?b>Rejected時(shí)調(diào)用。其中,第二個(gè)函數(shù)是可選的,不一定要提供。

這兩個(gè)函數(shù)都接受Promise實(shí)例傳出的值作為參數(shù)。(簡(jiǎn)單地說就是:上面的promise對(duì)象在處理異步操作的過程中,如果調(diào)用了resolve方法,則會(huì)將resolve的參數(shù)傳遞給then方法的第一個(gè)函數(shù),如果調(diào)用了reject方法,這會(huì)將reject的參數(shù)傳遞給then方法的第二個(gè)函數(shù))

then方法返回的是一個(gè)新的Promise實(shí)例(注意,不是原來那個(gè)Promise實(shí)例),因此可以采用鏈?zhǔn)綄懛?,?b>then方法后面在調(diào)用另一個(gè)then方法

上面的代碼使用then方法,依次指定了兩個(gè)回調(diào)函數(shù)。第一個(gè)回調(diào)函數(shù)完成以后,會(huì)將返回結(jié)果作為參數(shù),傳入第二個(gè)回調(diào)函數(shù)。(實(shí)際上是第一個(gè)then方法返回了一個(gè)Promise實(shí)例,在該實(shí)例中調(diào)用了resolve方法,而json.post則是作為resolve的參數(shù))

上面代碼中,第一個(gè)then方法指定的回調(diào)函數(shù),返回的是另一個(gè)Promise實(shí)例,則第一個(gè)then方法會(huì)直接將該Promise實(shí)例返回

Promise.prototype.catch()

該方法是.then(undefined, onRejected)的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。

promise.then(function(data) {
    console.log("success");
}).catch(function(error) {
    console.log("error", error);
});

promise對(duì)象的錯(cuò)誤,會(huì)一直向后傳遞,直到被捕獲。即錯(cuò)誤總會(huì)被下一個(gè)catch所捕獲。then方法指定的回調(diào)函數(shù),若拋出錯(cuò)誤,也會(huì)被下一個(gè)catch捕獲。catch中也能拋錯(cuò),則需要后面的catch來捕獲。

sendRequest("test.html").then(function(data1) {
    //do something
}).then(function (data2) {
    //do something
}).catch(function (error) {
    //處理前面三個(gè)Promise產(chǎn)生的錯(cuò)誤
});
Promise.all()

該方法用于將多個(gè)Promise實(shí)例,包裝成一個(gè)新的Promise實(shí)例

// p1,p2,p3都是promise實(shí)例
var p = Promise.all([p1, p2, p3]);

新的Promise實(shí)例的狀態(tài)由三個(gè)promise實(shí)例共同決定

當(dāng)三個(gè)promise實(shí)例的狀態(tài)都變?yōu)閒ulfilled,p的狀態(tài)才會(huì)變?yōu)閒ulfilled,并將三個(gè)promise返回的結(jié)果,按照參數(shù)順序存入數(shù)組,傳給p的回調(diào)函數(shù)

當(dāng)p1, p2, p3其中之一狀態(tài)變?yōu)閞ejected,p的狀態(tài)也會(huì)變?yōu)閞ejected,并把第一個(gè)被reject的promise的返回值,傳給p的回調(diào)函數(shù)

Promise..race()

該方法用于將多個(gè)Promise實(shí)例,包裝成一個(gè)新的Promise實(shí)例

// p1,p2,p3都是promise實(shí)例
var p = Promise.race([p1, p2, p3]);

新的Promise實(shí)例的狀態(tài)由三個(gè)promise實(shí)例共同決定

當(dāng)p1, p2, p3其中之一狀態(tài)發(fā)生改變(變?yōu)閒ulfilled或者rejected),p的狀態(tài)也會(huì)隨之改變,并把第一個(gè)改變狀態(tài)的promise的返回值,傳給p的回調(diào)函數(shù)

Promise.resolve()

Promise.resolve方法的參數(shù)分為四種情況

參數(shù)是一個(gè)Promise實(shí)例

如果參數(shù)是Promise實(shí)例,那么Promise.resolve將不做任何修改、原封不動(dòng)地返回這個(gè)實(shí)例。

參數(shù)是一個(gè)thenable對(duì)象

let thenable = {
  then: function(resolve, reject) {
    resolve(42);
  }
};

let p1 = Promise.resolve(thenable);
p1.then(function(value) {
  console.log(value);  // 42
});

Promise.resolve方法會(huì)將這個(gè)對(duì)象轉(zhuǎn)為Promise對(duì)象,然后就立即執(zhí)行thenable對(duì)象的then方法。

參數(shù)不是具有then方法的對(duì)象,或根本就不是對(duì)象

如果參數(shù)是一個(gè)原始值,或者是一個(gè)不具有then方法的對(duì)象,則Promise.resolve方法返回一個(gè)新的Promise對(duì)象,狀態(tài)為Resolved。

Promise.resolve("Success");

/*******等同于*******/
new Promise(function (resolve) {
    resolve("Success");
});

不帶任何參數(shù)

直接返回一個(gè)Resolved狀態(tài)的Promise對(duì)象。

Promise.resolve("Success");

/*******等同于*******/
new Promise(function (resolve) {
    resolve();
});
Promise.reject()
Promise.reject(new Error("error"));

/*******等同于*******/
new Promise(function (resolve, reject) {
    reject(new Error("error"));
});

這段代碼會(huì)讓這個(gè)Promise對(duì)象立即進(jìn)入rejected狀態(tài),并將錯(cuò)誤對(duì)象傳遞給then指定的onRejected回調(diào)函數(shù)。

參考資料

ECMAScript 6 入門

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83792.html

相關(guān)文章

  • 20170702-異步編程 async await

    摘要:是異步編程的另一種解決方案函數(shù)是對(duì)函數(shù)的改進(jìn)的基本用法函數(shù)函數(shù)返回一個(gè)實(shí)例,可以使用方法為返回的實(shí)例添加回調(diào)函數(shù)。函數(shù)內(nèi)部語句返回的值,會(huì)成為方法回調(diào)函數(shù)的參數(shù)。也就是說,只有函數(shù)內(nèi)部的異步操作執(zhí)行完,才會(huì)執(zhí)行方法指定的回調(diào)函數(shù)。 async await async await是異步編程的另一種解決方案 async函數(shù)是對(duì)Generator函數(shù)的改進(jìn) async的基本用法 asyn...

    StonePanda 評(píng)論0 收藏0
  • 2017-07-03 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選使用可變數(shù)據(jù)結(jié)構(gòu)知乎專欄我接觸過的前端數(shù)據(jù)結(jié)構(gòu)與算法人人網(wǎng)博客基于指令和混合的前端通用埋點(diǎn)方案知乎專欄的數(shù)據(jù)依賴實(shí)現(xiàn)原理簡(jiǎn)析從到掘金中文第期升級(jí)指南譯是什么鬼知乎專欄異步編程之每日技術(shù)筆記的個(gè)特性以及對(duì)的展 2017-07-03 前端日?qǐng)?bào) 精選 Redux 使用可變數(shù)據(jù)結(jié)構(gòu) - 知乎專欄我接觸過的前端數(shù)據(jù)結(jié)構(gòu)與算法 – 人人網(wǎng)FED博客基于指令和混合的前端通用埋點(diǎn)方案 - ...

    animabear 評(píng)論0 收藏0
  • JS異步編程Promise

    摘要:三是控制反轉(zhuǎn)控制權(quán)在其他人的代碼上,假如異步函數(shù)是別人提供的庫,我們把回調(diào)函數(shù)傳進(jìn)去,我們并不能知道異步函數(shù)在調(diào)用回調(diào)函數(shù)之外做了什么事情。錯(cuò)誤捕捉相比回調(diào)函數(shù)的錯(cuò)誤無法在外部捕捉的問題,能夠?yàn)橐贿B串的異步調(diào)用提供錯(cuò)誤處理。 前言 《JS異步編程之 callback》一文我們了解了JS 是基于單線程事件循環(huán)的概念構(gòu)建的,回調(diào)函數(shù)不會(huì)立即執(zhí)行,由事件輪詢?nèi)z測(cè)事件是否執(zhí)行完畢,當(dāng)執(zhí)行完有...

    Hegel_Gu 評(píng)論0 收藏0
  • ES6 異步編程二:Promise

    摘要:今天對(duì)于處理異步調(diào)用已經(jīng)有了很多成熟的方案,在我看來這些方案都無外乎在解決一個(gè)問題如何能看似順序地傳遞異步調(diào)用的結(jié)果,本文要說的就是原生提供的一個(gè)解決方案。在對(duì)進(jìn)行敘述之前,依舊引用阮大的入門一書中的章節(jié)便于大家更嚴(yán)謹(jǐn)和全面的學(xué)習(xí)和參考。 異步回調(diào)的泥潭 異步回調(diào)是最直接的異步結(jié)果處理模式,將一個(gè)回調(diào)函數(shù)callback扔進(jìn)異步處理函數(shù)中,當(dāng)異步處理獲得結(jié)果之后再調(diào)用這個(gè)回調(diào)函數(shù)就可以...

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

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(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元查看
<