摘要:本篇文章通過(guò)構(gòu)建一個(gè)簡(jiǎn)單的對(duì)象來(lái)了解如何做到異步獲得數(shù)據(jù)。的簡(jiǎn)單實(shí)現(xiàn)首先,我們要知道實(shí)際上是一個(gè)對(duì)象,當(dāng)我們運(yùn)行下面的代碼可以發(fā)現(xiàn)返回。
本篇文章通過(guò)構(gòu)建一個(gè)簡(jiǎn)單的Promise對(duì)象來(lái)了解如何做到異步獲得數(shù)據(jù)。
使用方法const fetch = function(url) { return new Promise((resolve, reject) => { request((error, apiResponse) => { if (error) { //返回為error的時(shí)候,調(diào)用reject函數(shù) reject(error) } // 有數(shù)據(jù)返回的時(shí)候,調(diào)用resolve resolve(apiResponse) }) }) }
這個(gè)fetch()的方法返回了一個(gè)Promise對(duì)象,接著我們就可以用then來(lái)對(duì)獲得的數(shù)據(jù)進(jìn)行處理,catch來(lái)捕獲可能的錯(cuò)誤。
Promise的簡(jiǎn)單實(shí)現(xiàn)首先,我們要知道Promise實(shí)際上是一個(gè)對(duì)象,當(dāng)我們運(yùn)行下面的代碼可以發(fā)現(xiàn)返回true。
console.log(typeof new Promise((resolve, reject) => {}) === "object") // true
接著要構(gòu)建一個(gè)Promise類,來(lái)生成Promise Object。
思路:在constructor 里面?zhèn)魅雃xecutionFunction, 然后將onResolve,onReject映射到里面,then主要做一件事情,就是將onResolve的函數(shù)收集起來(lái),在this.onResolve里面一起調(diào)用,每次返回的值都覆蓋前一次的。
說(shuō)的什么玩意兒,眼見為實(shí)下面來(lái)看一下代碼:
class PromiseSimple{ constructor(executionFunction) { this.promiseChain = []; this.onResolve = this.onResolve.bind(this) this.onReject = this.onReject.bind(this) this.handleError = () => {} // 外界傳入的函數(shù)我們將其定義為executionFunction,將里面 // 的onResolve onReject 映射到this.onResolve, this.onReject executionFunction(this.onResolve, this.onReject) } then(onResolve) { // 收集狀態(tài)成功的時(shí)候的回調(diào)函數(shù) this.promiseChain.push(onResolve) return this } catch(onReject) { this.handleError = onReject return this } onResolve(value) { var storedValue = value; try { // 在resolve里面執(zhí)行 this.promiseChain.forEach((executePromise) => { storedValue = executePromise(storedValue) }) } catch(error){ this.promiseChain = []; this.onReject(error) } } onReject(error) { this.handleError(error) } }梳理一下,其實(shí)只要記住其中兩點(diǎn):
1、這個(gè)對(duì)象有四個(gè)方法then catch onResolve onReject,它們的作用分別是
用來(lái)收集有數(shù)據(jù)的時(shí)候的回調(diào)函數(shù),放在this.promiseChain里,注意這里要返回this
對(duì)象才能實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用
用來(lái)處理出現(xiàn)的error,注意這里要返回this對(duì)象實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用
依次執(zhí)行then里面收集的回調(diào)函數(shù),并且將回調(diào)函數(shù)的返回值在作為參數(shù)傳給下一個(gè)回調(diào)函數(shù)
用來(lái)處理出現(xiàn)的error
2、then catch 必須要返回this,才能實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用
這樣我們一個(gè)簡(jiǎn)單的Promise 對(duì)象就做好了
下面可以用這個(gè)來(lái)玩一玩
class PromiseSimple { constructor(executionFunction) { this.promiseChain = []; this.handleError = () => {}; this.onResolve = this.onResolve.bind(this); this.onReject = this.onReject.bind(this); executionFunction(this.onResolve, this.onReject); } then(onResolve) { this.promiseChain.push(onResolve); return this; } catch(handleError) { this.handleError = handleError; return this; } onResolve(value) { let storedValue = value; try { this.promiseChain.forEach((nextFunction) => { storedValue = nextFunction(storedValue); }); } catch (error) { this.promiseChain = []; this.onReject(error); } } onReject(error) { this.handleError(error); } } fakeApiBackend = () => { const user = { username: "treyhuffine", favoriteNumber: 42, profile: "https://gitconnected.com/treyhuffine" }; // Introduce a randomizer to simulate the // the probability of encountering an error if (Math.random() > .05) { return user; } else { const error = { statusCode: 404, message: "Could not find user", error: "Not Found", }; return error; } }; // Assume this is your AJAX library. Almost all newer // ones return a Promise Object const makeApiCall = () => { return new PromiseSimple((resolve, reject) => { // Use a timeout to simulate the network delay waiting for the response. // This is THE reason you use a promise. It waits for the API to respond // and after received, it executes code in the `then()` blocks in order. // If it executed is immediately, there would be no data. setTimeout(() => { const apiResponse = fakeApiBackend(); if (apiResponse instanceof Error) { reject(apiResponse); } else { resolve(apiResponse); } }, 5000); }); }; makeApiCall() .then((user) => { console.log("In the first .then()"); return user; }) .then((user) => { console.log(`User ${user.username}"s favorite number is ${user.favoriteNumber}`); return user; }) .then((user) => { console.log("The previous .then() told you the favoriteNumber") return user.profile; }) .then((profile) => { console.log(`The profile URL is ${profile}`); }) .then(() => { console.log("This is the last then()"); }) .catch((error) => { console.log(error.message); });
參考文檔:
https://medium.com/gitconnect...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88959.html
摘要:近幾年隨著開發(fā)模式的逐漸成熟,規(guī)范順勢(shì)而生,其中就包括提出了規(guī)范,完全改變了異步編程的寫法,讓異步編程變得十分的易于理解。最后,是如此的優(yōu)雅但也只是解決了回調(diào)的深層嵌套的問(wèn)題,真正簡(jiǎn)化異步編程的還是,在端,建議考慮。 本篇,簡(jiǎn)單實(shí)現(xiàn)一個(gè)promise,主要普及promise的用法。 一直以來(lái),JavaScript處理異步都是以callback的方式,在前端開發(fā)領(lǐng)域callback機(jī)制...
摘要:實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的如果有錯(cuò)誤的地方,希望大家能夠不吝賜教僅實(shí)現(xiàn)及方法最下方有完整代碼開始一個(gè)對(duì)象接收的是一個(gè)這個(gè)接收兩個(gè)參數(shù)當(dāng)我們?cè)趦?nèi)執(zhí)行或的時(shí)候,就會(huì)調(diào)用內(nèi)定義的和函數(shù)然后,和函數(shù)會(huì)改變的狀態(tài)所以它應(yīng)該是像下面這樣的保存值記錄狀態(tài)為,為,為 實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的ES6 Promise(如果有錯(cuò)誤的地方,希望大家能夠不吝賜教) 僅實(shí)現(xiàn)Promise及.then方法最下方有完整代碼 開始 一個(gè)...
摘要:在和方法執(zhí)行的時(shí)候訂閱事件,將自己的回調(diào)函數(shù)綁定到事件上,屬性是發(fā)布者,一旦它的值發(fā)生改變就發(fā)布事件,執(zhí)行回調(diào)函數(shù)。實(shí)現(xiàn)和方法的回調(diào)函數(shù)都是,當(dāng)滿足條件對(duì)象狀態(tài)改變時(shí),這些回調(diào)會(huì)被放入隊(duì)列。所以我需要在某個(gè)變?yōu)闀r(shí),刪除它們綁定的回調(diào)函數(shù)。 前言 按照文檔說(shuō)明簡(jiǎn)單地實(shí)現(xiàn) ES6 Promise的各個(gè)方法并不難,但是Promise的一些特殊需求實(shí)現(xiàn)起來(lái)并不簡(jiǎn)單,我首先提出一些不好實(shí)現(xiàn)或者容...
摘要:簡(jiǎn)單實(shí)現(xiàn)前言你可能知道,的任務(wù)執(zhí)行的模式有兩種同步和異步。你已經(jīng)實(shí)現(xiàn)了方法方法是一個(gè)很好用的方法。感興趣的朋友可以自行去研究哈附上代碼完整的實(shí)現(xiàn)個(gè)人博客鏈接 Promise 簡(jiǎn)單實(shí)現(xiàn) 前言 你可能知道,javascript 的任務(wù)執(zhí)行的模式有兩種:同步和異步。 異步模式非常重要,在瀏覽器端,耗時(shí)很長(zhǎng)的操作(例如 ajax 請(qǐng)求)都應(yīng)該異步執(zhí)行,避免瀏覽器失去響應(yīng)。 在異步模式編程中,我...
摘要:為了降低異步編程的復(fù)雜性,所以。難理解請(qǐng)參考的誤區(qū)以及實(shí)踐異步編程的模式異步編程的種方法 異步編程 javascript異步編程, web2.0時(shí)代比較熱門的編程方式,我們平時(shí)碼的時(shí)候也或多或少用到,最典型的就是異步ajax,發(fā)送異步請(qǐng)求,綁定回調(diào)函數(shù),請(qǐng)求響應(yīng)之后調(diào)用指定的回調(diào)函數(shù),沒有阻塞其他代碼的執(zhí)行。還有像setTimeout方法同樣也是異步執(zhí)行回調(diào)的方法。 如果對(duì)異步編程...
摘要:近幾年隨著開發(fā)模式的逐漸成熟,規(guī)范順勢(shì)而生,其中就包括提出了規(guī)范,完全改變了異步編程的寫法,讓異步編程變得十分的易于理解。最后,是如此的優(yōu)雅但也只是解決了回調(diào)的深層嵌套的問(wèn)題,真正簡(jiǎn)化異步編程的還是,在端,建議考慮。 前段時(shí)間頻頻看到Promise這個(gè)詞,今天發(fā)現(xiàn)騰訊AlloyTeam寫得這篇很贊,遂轉(zhuǎn)之。 原文鏈接 本篇,主要普及promise的用法。 一直以來(lái),JavaScrip...
閱讀 2025·2023-04-25 14:50
閱讀 2907·2021-11-17 09:33
閱讀 2611·2019-08-30 13:07
閱讀 2838·2019-08-29 16:57
閱讀 908·2019-08-29 15:26
閱讀 3540·2019-08-29 13:08
閱讀 1990·2019-08-29 12:32
閱讀 3383·2019-08-26 13:57