摘要:對(duì)象這個(gè)東西吧,它一直困擾我很久很久了,但是之前未能靜下心來好好研究下,現(xiàn)在終于有時(shí)間好好鼓搗一下了。
Promise 對(duì)象
promise這個(gè)東西吧,它一直困擾我很久很久了,但是之前未能靜下心來好好研究下,現(xiàn)在終于有時(shí)間好好鼓搗一下了。
順帶記錄下吧~~
特點(diǎn)特點(diǎn)
then的鏈?zhǔn)秸{(diào)用
Promise.all()
The Promise object represents the eventual completion (or failure) of an asynchronous operation, and its resulting value.
一種異步編程的解決方案
有了Promise對(duì)象,就可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(diào)函數(shù)
then方式是定義在Promise.prototype上的,所以Promise實(shí)例就能調(diào)用這個(gè)方法,添加狀態(tài)改變時(shí)的回調(diào)函數(shù)了
對(duì)象的狀態(tài)不受外界影響
Pending => Resolve
Pending => Fulfilled
一旦狀態(tài)改變就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果
then 的 鏈?zhǔn)秸{(diào)用 第一個(gè)回調(diào)函數(shù)返回正常值使用Mock模擬接口,定義了兩個(gè)接口
Mock.mock("http://g.cn", { "data|0-10": [{ "id|+1": 1, "thscode|1-100.2": 1, "zqjc": Mock.Random.csentence(5) }] }); Mock.mock("http://q.cn", { "data|0-10": [{ "id|+1": 1, "jgcg": Mock.Random.csentence(5) }] });
獲取ajax的通用函數(shù),接收url地址作為參數(shù)
function getAjax(url){ return new Promise(function(resolve, reject) { axios.get(url) .then(function(response){ resolve(response); console.log("ajax 1:", response); }) .catch(function(err){ reject(err); console.log(err); }); }); }
下面的代碼使用then方法依次指定了兩個(gè)回調(diào)函數(shù)。
第一個(gè)回調(diào)函數(shù)完成后,會(huì)將返回結(jié)果
作為第二個(gè)回調(diào)函數(shù)的參數(shù)傳入
通過運(yùn)行結(jié)果即可知
function getIndexData(){ getAjax("http://g.cn").then(function(res) { console.log("第一個(gè)then: ", res); return res.data; }) .then(function(res) { console.log("第二個(gè)then: ", res); }).catch(err => { console.log(err); }) } getIndexData()第一個(gè)回調(diào)函數(shù)返回的仍舊是一個(gè)promise
如果是這樣,也就是還存在異步,則第二個(gè)回調(diào)的執(zhí)行就需等待第一個(gè)執(zhí)行完畢,不管是resolve還是reject
function getAjax2(url){ return new Promise(function(resolve, reject) { axios.get(url) .then(function(response){ setTimeout(() => { resolve(response); }, 2000); console.log("ajax 2:", response); }) .catch(function(err){ reject(err); console.log(err); }); }); } function getIndex2Data() { getAjax("http://g.cn").then(res => { return getAjax2("http://q.cn"); }) .then(res => { console.log("in the data: ", res); }) .catch(err => { console.log(err); }); } getIndex2Data();Promise.all()
如下代碼,定義了p1、p2, 和p
p的狀態(tài)是由p1和p2決定的
只有p1和shup2的狀態(tài)都變成了Fulfilled,p的狀態(tài)才會(huì)變成Fulfilled,此時(shí)p1和p2的返回值組成一個(gè)數(shù)組,傳遞給p的回調(diào)函數(shù);
只要p1、p2的狀態(tài)中有一個(gè)被Rejected,p的狀態(tài)就變成Rejected,此時(shí)第一個(gè)被Rejected的實(shí)例的返回值會(huì)傳遞給p的回調(diào)函數(shù)
#1均為p1和p2增加了catch函數(shù),則,如果p1或者p2發(fā)生reject或者其它異常,那么會(huì)由自己的catch函數(shù)捕獲,等到執(zhí)行完catch,實(shí)例的狀態(tài)也變成了resovled
var p1 = new Promise((resolve, reject) => { resolve("one corgi"); }) .then(res => res) .catch(err => err) var p2 = new Promise((resolve, reject) => { resolve("two corgies"); }) .then(res => res) .catch(err => err) var p = Promise.all([p1, p2]); p.then(res => { console.log(res); }) .catch((err) => { console.log("all:", err); }); // 輸出: ["one corgi", "two corgies"]#2
增加p3,不帶catch,則最終的就會(huì)被p的catch捕獲了
var p3 = new Promise((resolve, reject) => { reject("Error"); }) .then(res => res) var p = Promise.all([p1, p2, p3]); p.then(res => { console.log(res); }) .catch((err) => { console.log("all:", err); }); //輸出: ["all: Error]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/95845.html
摘要:意味著操作成功完成。方法接收失敗情況的回調(diào)函數(shù)作為參數(shù),返回一個(gè)對(duì)象。參數(shù)回調(diào)函數(shù)不接收任何參數(shù),當(dāng)對(duì)象變成狀態(tài)時(shí)被調(diào)用?,F(xiàn)在各個(gè)方法的參數(shù)返回值功能和使用方法已經(jīng)有個(gè)大概的了解了,為了進(jìn)一步理解其原理,接下來我打算簡單地實(shí)現(xiàn)一下它。 前言 最近幾周參加筆試面試,總是會(huì)遇到實(shí)現(xiàn)異步和處理異步的問題,然而作者每次都無法完美地回答。在最近一次筆試因?yàn)?Promise 而被刷掉后,我終于下定...
摘要:反之,操作失敗,對(duì)象由狀態(tài)轉(zhuǎn)換為狀態(tài),此時(shí)回調(diào)函數(shù)會(huì)執(zhí)行方法。這里需要注意的是,雖然在之后便執(zhí)行了方法,但是并不是意味著往后的對(duì)象不執(zhí)行了,其他的還是對(duì)象還是要執(zhí)行的,只是不會(huì)再調(diào)用函數(shù)。 在 掘金上看見一篇寫promise的文章,感覺作者寫的很棒,文章鏈接在這:八段代碼徹底掌握 Promise ??赐曛蟾杏X學(xué)到了很多,所以又重新把JavaScript Promise迷你書(中文版)...
摘要:總結(jié)用方法創(chuàng)建對(duì)象用或添加對(duì)象的處理函數(shù)它的作用是為實(shí)例添加狀態(tài)改變時(shí)的回調(diào)函數(shù)。方法是的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。 一、為什么需要Promise Javascript 采用回調(diào)函數(shù)(callback)來處理異步編程。從同步編程到異步回調(diào)編程有一個(gè)適應(yīng)的過程,但是如果出現(xiàn)多層回調(diào)嵌套,也就是我們常說的回調(diào)金字塔(Pyramid of Doom),絕對(duì)是一種糟糕的編程體驗(yàn)。于是...
摘要:方法是的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。由于字符串不屬于異步操作判斷方法是字符串對(duì)象不具有方法,返回實(shí)例的狀態(tài)從一生成就是,所以回調(diào)函數(shù)會(huì)立即執(zhí)行。出錯(cuò)了等同于出錯(cuò)了出錯(cuò)了上面的代碼生成一個(gè)對(duì)象的實(shí)例,狀態(tài)為,回調(diào)函數(shù)會(huì)立即執(zhí)行。 引言 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)和事件——更合理且強(qiáng)大。最近的項(xiàng)目要用到這個(gè),就參照阮一峰老師的《ES6標(biāo)準(zhǔn)入門...
摘要:的實(shí)現(xiàn)說明沒有執(zhí)行里的函數(shù)說明執(zhí)行了里的函數(shù)說明執(zhí)行里的函數(shù)過程中出現(xiàn)錯(cuò)誤和執(zhí)行狀態(tài)時(shí)的回調(diào)函數(shù)后返回的結(jié)果都需要執(zhí)行傳進(jìn)來的對(duì)象不能等于當(dāng)前的對(duì)象回調(diào)返回的值或者的值是對(duì)象時(shí)需要等待該對(duì)象的狀態(tài)變更設(shè)置當(dāng)前狀態(tài)的狀態(tài)和值執(zhí)行回調(diào)隊(duì)列里的函 function resolve_promise_value(promise,value) {//PromiseA+的實(shí)現(xiàn) var th...
摘要:則是把類似的異步處理對(duì)象和處理規(guī)則進(jìn)行規(guī)范化,并按照采用統(tǒng)一的接口來編寫,而采取規(guī)定方法之外的寫法都會(huì)出錯(cuò)。這個(gè)對(duì)象有一個(gè)方法,指定回調(diào)函數(shù),用于在異步操作執(zhí)行完后執(zhí)行回調(diào)函數(shù)處理。到目前為止,已經(jīng)學(xué)習(xí)了創(chuàng)建對(duì)象和用,方法來注冊(cè)回調(diào)函數(shù)。 Promise 本文從js的異步處理出發(fā),引入Promise的概念,并且介紹Promise對(duì)象以及其API方法。 js里的異步處理 可以參考這篇文章...
閱讀 4076·2021-11-22 13:53
閱讀 1775·2021-09-23 11:52
閱讀 2536·2021-09-06 15:02
閱讀 1094·2019-08-30 15:54
閱讀 954·2019-08-30 14:15
閱讀 2438·2019-08-29 18:39
閱讀 762·2019-08-29 16:07
閱讀 554·2019-08-29 13:13