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