成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

3行代碼實現(xiàn)一個簡易版promise

ralap / 2021人閱讀

前言

作為一個后端過來的同學(xué),剛?cè)腴T前端的時候,被js種種「反人類」的概念折騰的死去活來的.
其中一個印象比較深刻的,就是promise,感覺實在太難理解了...所有就有了寫個簡單的promise的想法.
希望能幫助到一些跟我一樣,感覺promise很難理解的新同學(xué).

promise的教程網(wǎng)上多如牛毛,其中寫的比較通俗易懂的莫過于阮一峰的es6,反正我是他的書才懂的.
所以今天,我們也不會來復(fù)述一遍如何使用promise,今天我們從另一個角度學(xué)習(xí)promise,
先自己動手造一個輪子--實現(xiàn)一個最簡單的promise,解決 回調(diào)地獄 的問題.

簡單實現(xiàn)

請看代碼

function easyPromise (fn) {
    this.then = cb => this.cb = cb
    this.resolve = data => this.cb(data)
    fn(this.resolve)
}
詳解

上面的代碼就實現(xiàn)了一個簡單的,實現(xiàn)then回調(diào)的「promise」,這里為了縮短代碼量,用了es6的簡寫,實際展開應(yīng)該是這樣

function easyPromise (fn) {
    var that = this

    // 第一步,定義 then()
    this.then = function (cb) {
        //先將 then() 括號里面的參數(shù)(回調(diào)函數(shù))保存起來
        that.cb = cb
    }

    // 定義一個 resolve
    this.resolve = function(data) {
        that.cb(data)
    }

    // 將 resolve 作為回調(diào)函數(shù),傳給fn
    fn(this.resolve)
}

接下來我們看看如何使用

new easyPromise((resolve) => {
    setTimeout(() => {
        resolve("延時執(zhí)行")
    }, 1000)
}).then((data) => {
    console.log(data)
})

結(jié)果: 控制臺在1秒之后,輸出 延時執(zhí)行

同樣為了方便理解,我們不妨把以上代碼寫好理解一點.

// 定義一個要傳給 promise 的函數(shù),它接收一個函數(shù)(resolve)作為參數(shù)。
// resolve 的作用是在合適的時間,通知 promise 應(yīng)該要執(zhí)行 then 里面的回調(diào)函數(shù)了。
function promiseCallback (resolve) {
   setTimeout(() => {
      resolve("延時執(zhí)行")
   }, 1000)
}

// 定義一個 要傳給 then 的回調(diào)函數(shù)
function thenCallback (data) {
    console.log(data)
}

// 實例化 promis,并分別傳入對應(yīng)的回調(diào)
new easyPromise(promiseCallback)
.then(thenCallback)
tips:  promise.then() 的時候,并沒有馬上執(zhí)行括號里面的回調(diào)函數(shù),只是把括號里面的回調(diào)函數(shù)保存起來.

我們來梳理一下執(zhí)行流程

先通過 thenthenCallback 存起來

this.then = function (cb) {
  that.cb = cb
}

這里的 cb , 就是上例的 thenCallback 所以其實可以等價于 this.cb = thenCallback

執(zhí)行 promise 括號里的函數(shù),并把事先定義好的 resolve 函數(shù)作為參數(shù)傳給他

fn(this.resolve)

這里的 fn , 就是上例的 promiseCallback

執(zhí)行 promiseCallback 我們的邏輯就跳到 promiseCallback 函數(shù)內(nèi)部去

setTimeout(() => {
  resolve("延時執(zhí)行")
}, 1000)

邏輯很簡單,就是等待1秒后,執(zhí)行 resolve 函數(shù), 這個 resolve 哪來的呢?

fn(this.resolve) -> promiseCallback (resolve) -> resolve

執(zhí)行 resolve 我們的邏輯就跳到 resolve 函數(shù)內(nèi)部去

that.cb(data)

這個 that.cb 又是哪來的呢? 就是我們第一步保存的 then括號里面的回調(diào)函數(shù),也就是 thenCallback

console.log(data)

所以就在1秒后輸出 延時執(zhí)行

最后

好了,以上就是 promise 的核心邏輯,當然還有很多功能沒實現(xiàn),不過本文的目的是幫助新手更好的了解 promise,
不是要實現(xiàn)一個完整的,符合 promise A+規(guī)范的 promise, 想要了解更多的童鞋,這里推薦幾個鏈接

阮一峰:ECMAScript 6 入門 - Promise 對象

深入 Promise(一)——Promise 實現(xiàn)詳解

淺談Promise之按照Promise/A+規(guī)范實現(xiàn)Promise類

如果覺得本文對您有用,請給本文的github加個star,萬分感謝

另外,github上還有其他一些關(guān)于前端的教程和組件,
有興趣的童鞋可以看看,你們的支持就是我最大的動力。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/95277.html

相關(guān)文章

  • 【js】what is Promise和手寫實現(xiàn)簡易Promise

    摘要:有三種狀態(tài),等待中,已完成,已失敗。對象狀態(tài)不受外界影響,只有異步操作的結(jié)果可以改變狀態(tài),這就是的由來怎么用接受一個函數(shù)作為參數(shù),這個參數(shù)函數(shù)的兩個參數(shù)分別是和,用來執(zhí)行了兩種狀態(tài)的回調(diào)函數(shù)。當實例生成后,用方法來指定兩種狀態(tài)的回調(diào)函數(shù)。 什么是Promise 官方的解釋:Promise是一個用來傳遞異步操作消息的對象。Promise有三種狀態(tài),pending(等待中),resolve...

    LMou 評論0 收藏0
  • JavaScript之手寫Promise

    摘要:如果狀態(tài)是等待態(tài)的話,就往回調(diào)函數(shù)中函數(shù),比如如下代碼就會進入等待態(tài)的邏輯以上就是簡單版實現(xiàn)實現(xiàn)一個符合規(guī)范的接下來大部分代碼都是根據(jù)規(guī)范去實現(xiàn)的。 為更好的理解, 推薦閱讀Promise/A+ 規(guī)范 實現(xiàn)一個簡易版 Promise 在完成符合 Promise/A+ 規(guī)范的代碼之前,我們可以先來實現(xiàn)一個簡易版 Promise,因為在面試中,如果你能實現(xiàn)出一個簡易版的 Promise ...

    stefan 評論0 收藏0
  • 40js實現(xiàn)一個簡易Promise

    摘要:最近面試有問到的原理,以及實現(xiàn)的方法。所以自己動手實現(xiàn)了一個,發(fā)個文章記錄下。簡單分析下,實例對象有兩個屬性,一個是,一個是。 最近面試有問到Promise的原理,以及實現(xiàn)的方法。所以自己動手實現(xiàn)了一個,發(fā)個文章記錄下。簡單分析下,promise實例對象有兩個屬性,一個是status,一個是value。還有一個then方法。status有3個狀態(tài),pending,resolved,re...

    nihao 評論0 收藏0
  • 超級易懂的redux-saga原理解析

    摘要:原文地址前言筆者最近在做一些后臺項目,使用的是,其使用了處理異步數(shù)據(jù)流,本文將對的原理做一個簡單的解讀,并將實現(xiàn)一個簡易版的。函數(shù)的自動流程控制在中,是指一些長時操作,用函數(shù)表示。 原文地址 前言 筆者最近在做一些后臺項目,使用的是Ant Design Pro,其使用了redux-saga處理異步數(shù)據(jù)流,本文將對redux-saga的原理做一個簡單的解讀,并將實現(xiàn)一個簡易版的redux...

    wendux 評論0 收藏0
  • KOA2框架原理解析和實現(xiàn)

    摘要:實現(xiàn)的四大模塊上文簡述了源碼的大體框架結(jié)構(gòu),接下來我們來實現(xiàn)一個的框架,筆者認為理解和實現(xiàn)一個框架需要實現(xiàn)四個大模塊,分別是封裝創(chuàng)建類構(gòu)造函數(shù)構(gòu)造對象中間件機制和剝洋蔥模型的實現(xiàn)錯誤捕獲和錯誤處理下面我們就逐一分析和實現(xiàn)。 什么是koa框架? ? ? ? ?koa是一個基于node實現(xiàn)的一個新的web框架,它是由express框架的原班人馬打造的。它的特點是優(yōu)雅、簡潔、表達力強、自由度...

    tracymac7 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<