国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Promise的簡(jiǎn)單實(shí)現(xiàn)

Hwg / 720人閱讀

摘要:本篇文章通過(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,它們的作用分別是

then

用來(lái)收集有數(shù)據(jù)的時(shí)候的回調(diào)函數(shù),放在this.promiseChain里,注意這里要返回this

對(duì)象才能實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

catch

用來(lái)處理出現(xiàn)的error,注意這里要返回this對(duì)象實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

onResolve

依次執(zhí)行then里面收集的回調(diào)函數(shù),并且將回調(diào)函數(shù)的返回值在作為參數(shù)傳給下一個(gè)回調(diào)函數(shù)

onReject

用來(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

相關(guān)文章

  • JavaScript Promise啟示錄

    摘要:近幾年隨著開發(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ī)制...

    Juven 評(píng)論0 收藏0
  • 簡(jiǎn)單實(shí)現(xiàn) ES6 Promise

    摘要:實(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è)...

    zhichangterry 評(píng)論0 收藏0
  • Promise——從閱讀文檔到簡(jiǎn)單實(shí)現(xiàn)(二)

    摘要:在和方法執(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)或者容...

    dinfer 評(píng)論0 收藏0
  • Promise 簡(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)。 在異步模式編程中,我...

    dayday_up 評(píng)論0 收藏0
  • [ JS 進(jìn)階 ] 異步編程 promise模式 簡(jiǎn)單實(shí)現(xiàn)

    摘要:為了降低異步編程的復(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ì)異步編程...

    svtter 評(píng)論0 收藏0
  • [轉(zhuǎn)載·JS] JavaScript Promise啟示錄

    摘要:近幾年隨著開發(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...

    Lyux 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<