最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ES6 Promise對(duì)象概念及用法實(shí)例詳解

 更新時(shí)間:2019年10月15日 10:39:56   作者:機(jī)智的導(dǎo)演  
這篇文章主要介紹了ES6 Promise對(duì)象概念及用法,結(jié)合實(shí)例形式詳細(xì)分析了ES6中Promise對(duì)象的概念、原理、創(chuàng)建、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了ES6 Promise對(duì)象概念及用法。分享給大家供大家參考,具體如下:

參考文章:ECMAScript 6 入門

一、 Promise是什么

Promise是異步編程的一種解決方案,它是一個(gè)容器,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件的結(jié)果。它有三種狀態(tài),只有異步操作的結(jié)果才能決定當(dāng)前的狀態(tài),不受外界因素的影響。而一旦狀態(tài)改變,就不會(huì)再變,也就是狀態(tài)凝固了(resolved),任何時(shí)候都可以得到這個(gè)結(jié)果。

Promise的缺點(diǎn):
1. 無(wú)法取消Promise,一旦新建它就會(huì)立即執(zhí)行,無(wú)法中途取消。
2. 如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部。
3. 當(dāng)處于pending狀態(tài)時(shí),無(wú)法得知目前進(jìn)展到哪一個(gè)階段(剛剛開(kāi)始還是即將完成)。

二、Promise的用法

/**
 * 創(chuàng)建Promise實(shí)例
 * @type {Promise}
 * @param resolve 在異步操作成功時(shí)調(diào)用
 * @param reject 在異步操作失敗時(shí)調(diào)用
 */
const promise = new Promise(function(resolve, reject) {
  // ... some code
  if (/* 異步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});
//調(diào)用Promise
promise.then(function(value) {
 // success
}, function(error) {
 // failure
});

Promise 新建后就會(huì)立即執(zhí)行。

let promise = new Promise(function(resolve, reject) {
 console.log('Promise');
 resolve();
});
promise.then(function() {
 console.log('resolved.');
});
console.log('Hi!');
// Promise (Promise 新建后立即執(zhí)行,所以首先輸出的是Promise)
// Hi!
// resolved (then方法指定的回調(diào)函數(shù),將在當(dāng)前腳本所有同步任務(wù)執(zhí)行完才會(huì)執(zhí)行,所以resolved最后輸出)

如果調(diào)用resolve函數(shù)和reject函數(shù)時(shí)帶有參數(shù),那么它們的參數(shù)會(huì)被傳遞給回調(diào)函數(shù)。reject函數(shù)的參數(shù)通常是Error對(duì)象的實(shí)例,表示拋出的錯(cuò)誤;resolve函數(shù)的參數(shù)除了正常的值以外,還可能是另一個(gè) Promise 實(shí)例。

const p1 = new Promise(function (resolve, reject) {
 setTimeout(() => reject(new Error('fail')), 3000)
})
const p2 = new Promise(function (resolve, reject) {
 setTimeout(() => resolve(p1), 1000)
})
p2
 .then(result => console.log(result))
 .catch(error => console.log(error))
// Error: fail

上面代碼中,p1是一個(gè) Promise,3 秒之后變?yōu)閞ejected。p2的狀態(tài)在 1 秒之后改變,resolve方法返回的是p1。由于p2返回的是另一個(gè) Promise,導(dǎo)致p2自己的狀態(tài)無(wú)效了,由p1的狀態(tài)決定p2的狀態(tài)。所以,后面的then語(yǔ)句都變成針對(duì)后者(p1)。又過(guò)了 2 秒,p1變?yōu)閞ejected,導(dǎo)致觸發(fā)catch方法指定的回調(diào)函數(shù)。

三、Promise原型上的方法

Promise.prototype.then()

  1. then方法的第一個(gè)參數(shù)是resolved狀態(tài)的回調(diào)函數(shù),第二個(gè)參數(shù)(可選)是rejected狀態(tài)的回調(diào)函數(shù)。
  2. then方法返回的是一個(gè)新的Promise實(shí)例,但不是原來(lái)那個(gè)Promise實(shí)例。因此可以采用鏈?zhǔn)綄懛ǎ磘hen方法后面再調(diào)用另一個(gè)then方法。
getJSON("/post/1.json").then(
 post => getJSON(post.commentURL)
).then(
 comments => console.log("resolved: ", comments),
 err => console.log("rejected: ", err)
);

Promise.prototype.catch()

  1. Promise.prototype.catch方法是.then(null, rejection)的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。
  2. Promise 對(duì)象的錯(cuò)誤具有“冒泡”性質(zhì),會(huì)一直向后傳遞,直到被捕獲為止。也就是說(shuō),錯(cuò)誤總是會(huì)被下一個(gè)catch語(yǔ)句捕獲。
getJSON('/post/1.json').then(function(post) {
 return getJSON(post.commentURL);
}).then(function(comments) {
 // some code
}).catch(function(error) {
 // 處理前面三個(gè)Promise產(chǎn)生的錯(cuò)誤
});
//上面代碼中,一共有三個(gè) Promise 對(duì)象:一個(gè)由getJSON產(chǎn)生,兩個(gè)由then產(chǎn)生。它們之中任何一個(gè)拋出的錯(cuò)誤,都會(huì)被最后一個(gè)catch捕獲。

Promise.prototype.finally()

  • finally方法用于指定不管 Promise 對(duì)象最后狀態(tài)如何,都會(huì)執(zhí)行的操作。該方法是 ES2018 引入標(biāo)準(zhǔn)的。
  • finally方法的回調(diào)函數(shù)不接受任何參數(shù),這意味著沒(méi)有辦法知道,前面的 Promise 狀態(tài)到底是fulfilled還是rejected。這表明,finally方法里面的操作,應(yīng)該是與狀態(tài)無(wú)關(guān)的,不依賴于 Promise 的執(zhí)行結(jié)果。

四、Promise的方法

Promise.all()

  1. Promise.all方法用于將多個(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例。
  2. const p = Promise.all([p1, p2, p3]);
    1. 只有p1、p2、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會(huì)變成fulfilled,此時(shí)p1、p2、p3的返回值組成一個(gè)數(shù)組,傳遞給p的回調(diào)函數(shù)。
    2. 只要p1、p2、p3之中有一個(gè)被rejected,p的狀態(tài)就變成rejected,此時(shí)第一個(gè)被reject的實(shí)例的返回值,會(huì)傳遞給p的回調(diào)函數(shù)。
  3. 如果p1、p2、p3有自己的catch方法,則不會(huì)觸發(fā)p的catch方法,如果沒(méi)有,才會(huì)調(diào)用Promise.all()的catch方法。
const p1 = new Promise((resolve, reject) => {
 resolve('hello');
})
.then(result => result)
.catch(e => e);
const p2 = new Promise((resolve, reject) => {
 throw new Error('報(bào)錯(cuò)了');
})
.then(result => result)
.catch(e => e);
Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// ["hello", Error: 報(bào)錯(cuò)了]
-------------------------------------------------------------------
const p1 = new Promise((resolve, reject) => {
 resolve('hello');
})
.then(result => result);
const p2 = new Promise((resolve, reject) => {
 throw new Error('報(bào)錯(cuò)了');
})
.then(result => result);
Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// Error: 報(bào)錯(cuò)了

Promise.race()

  1. Promise.race方法同樣是將多個(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例。
  2. race內(nèi)部的一個(gè)實(shí)例率先改變狀態(tài),Promise.race()的狀態(tài)就跟著改變。那個(gè)率先改變的Promise實(shí)例的返回值,就傳遞給Promise.race()的回調(diào)函數(shù)。

Promise.resolve()

  1. 有時(shí)需要將現(xiàn)有對(duì)象轉(zhuǎn)為 Promise 對(duì)象,Promise.resolve方法就起到這個(gè)作用。
  2. Promise.resolve方法的參數(shù)分成四種情況。
    1. 參數(shù)是一個(gè) Promise 實(shí)例:如果參數(shù)是 Promise 實(shí)例,那么Promise.resolve將不做任何修改、原封不動(dòng)地返回這個(gè)實(shí)例。
    2. 參數(shù)是一個(gè)thenable對(duì)象:thenable對(duì)象指的是具有then方法的對(duì)象,Promise.resolve方法會(huì)將這個(gè)對(duì)象轉(zhuǎn)為 Promise 對(duì)象,然后就立即執(zhí)行thenable對(duì)象的then方法。
    3. 參數(shù)不是具有then方法的對(duì)象,或根本就不是對(duì)象:如果參數(shù)是一個(gè)原始值,或者是一個(gè)不具有then方法的對(duì)象,則Promise.resolve方法返回一個(gè)新的 Promise 對(duì)象,狀態(tài)為resolved。
    4. 不帶有任何參數(shù):Promise.resolve方法允許調(diào)用時(shí)不帶參數(shù),直接返回一個(gè)resolved狀態(tài)的 Promise 對(duì)象。

需要注意的是,立即resolve的 Promise 對(duì)象,是在本輪“事件循環(huán)”(event loop)的結(jié)束時(shí),而不是在下一輪“事件循環(huán)”的開(kāi)始時(shí)。

setTimeout(function () {
 console.log('three');
}, 0);
Promise.resolve().then(function () {
 console.log('two');
});
console.log('one');
// one
// two
// three

Promise.reject()

  1. Promise.reject(reason)方法也會(huì)返回一個(gè)新的 Promise 實(shí)例,該實(shí)例的狀態(tài)為rejected。
  2. 注意,Promise.reject()方法的參數(shù),會(huì)原封不動(dòng)地作為reject的理由,變成后續(xù)方法的參數(shù)。這一點(diǎn)與Promise.resolve方法不一致。
const thenable = {
 then(resolve, reject) {
  reject('出錯(cuò)了');
 }
};
Promise.reject(thenable)
.catch(e => {
 console.log(e === thenable)
})
// true

五、Promise的應(yīng)用

包裝http請(qǐng)求

在使用vue的過(guò)程中,我們用Promise對(duì)Axios進(jìn)行了包裝。

newAxios.post = function (url, params) {
 params = qs.stringify(params);
 return new Promise((resolve, reject) => {
  Axios.post(url, params)
   .then(res => {
    if (res.headers.warning === "redirect") {
     window.location.href = "/"
    } else {
     resolve(res);
    }
   })
   .catch(err => {
    reject(err);
   })
 })
};

處理異步請(qǐng)求

使用Promise.all()方法可以處理異步請(qǐng)求,比如某些請(qǐng)求需要在前面幾個(gè)請(qǐng)求完成之后才觸發(fā)。

后續(xù)待補(bǔ)充。

附:ECMAScript 6 入門本站下載地址:http://m.fzitv.net/books/551561.html

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 使用InstantClick.js讓頁(yè)面提前加載200ms

    使用InstantClick.js讓頁(yè)面提前加載200ms

    本篇文章主要介紹了使用InstantClick.js讓頁(yè)面提前加載200ms,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 微信小程序頁(yè)面間傳遞數(shù)組對(duì)象方法解析

    微信小程序頁(yè)面間傳遞數(shù)組對(duì)象方法解析

    這篇文章主要介紹了微信小程序頁(yè)面間傳遞數(shù)組對(duì)象方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解JavaScript實(shí)現(xiàn)哈希表

    詳解JavaScript實(shí)現(xiàn)哈希表

    哈希表是一種非常重要的數(shù)據(jù)結(jié)構(gòu),幾乎所有的編程語(yǔ)言都有直接或者間接的應(yīng)用這種數(shù)據(jù)結(jié)構(gòu)。本文將為大家介紹通過(guò)JavaScript如何實(shí)現(xiàn)哈希表,以及哈希表的一些常用操作,需要的可以參考一下
    2021-12-12
  • Javascript類型轉(zhuǎn)換詳解

    Javascript類型轉(zhuǎn)換詳解

    這篇文章主要為大家介紹了Javascript類型轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • JavaScript跨平臺(tái)的開(kāi)源框架NativeScript

    JavaScript跨平臺(tái)的開(kāi)源框架NativeScript

    本文給大家分享的是一款使用javascript來(lái)構(gòu)建跨平臺(tái)原生移動(dòng)應(yīng)用的開(kāi)源框架--NativeScript,可以使用JavaScript開(kāi)發(fā)跨平臺(tái)、真正原生的iOS, Android 和 Windows 移動(dòng)App。開(kāi)發(fā)人員使用NativeScript提供的庫(kù)來(lái)構(gòu)建應(yīng)用UI,其抽象了各種原生平臺(tái)之間的不同。
    2015-03-03
  • 深入學(xué)習(xí)js瀑布流布局

    深入學(xué)習(xí)js瀑布流布局

    這篇文章主要幫助大家深入理解js瀑布流布局,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • ajax接收后臺(tái)數(shù)據(jù)在html頁(yè)面顯示

    ajax接收后臺(tái)數(shù)據(jù)在html頁(yè)面顯示

    本篇文章主要介紹了ajax接收后臺(tái)數(shù)據(jù)在html頁(yè)面顯示的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • JavaScript判斷變量是對(duì)象還是數(shù)組的方法

    JavaScript判斷變量是對(duì)象還是數(shù)組的方法

    這篇文章主要介紹了JavaScript判斷變量是對(duì)象還是數(shù)組的方法,本文分別使用instanceof和typeof實(shí)現(xiàn),需要的朋友可以參考下
    2014-08-08
  • js 提交form表單和設(shè)置form表單請(qǐng)求路徑的實(shí)現(xiàn)方法

    js 提交form表單和設(shè)置form表單請(qǐng)求路徑的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇js 提交form表單和設(shè)置form表單請(qǐng)求路徑的實(shí)現(xiàn)方法。
    2016-10-10
  • 詳解小程序rich-text對(duì)富文本支持方案

    詳解小程序rich-text對(duì)富文本支持方案

    目前小程序使用比較多的富文本方案一個(gè)是小程序自帶的rich-text組件,一個(gè)是wxPrase,本篇文章主要介紹了詳解小程序rich-text對(duì)富文本支持方案,感興趣的小伙伴們可以參考一下
    2018-11-11

最新評(píng)論

麦盖提县| 贺州市| 焉耆| 湘阴县| 登封市| 海宁市| 建平县| 通城县| 苗栗市| 策勒县| 云南省| 株洲市| 高淳县| 高邮市| 曲沃县| 温泉县| 长汀县| 土默特右旗| 乐清市| 定州市| 会昌县| 寿阳县| 沐川县| 广宗县| 理塘县| 嘉祥县| 塔河县| 盐边县| 长岭县| 新郑市| 杂多县| 泗阳县| 横峰县| 东至县| 连城县| 英德市| 中阳县| 正镶白旗| 自贡市| 罗平县| 贵州省|