亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

LMou / 903人閱讀

摘要:有三種狀態(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(等待中),resolved(已完成),rejected(已失?。?。對象狀態(tài)不受外界影響,只有異步操作的結(jié)果可以改變狀態(tài),這就是“promise“的由來

怎么用Promise

Promise接受一個函數(shù)作為參數(shù),這個參數(shù)函數(shù)的兩個參數(shù)分別是resolved和rejected,用來執(zhí)行了兩種狀態(tài)的回調(diào)函數(shù)。
當Promise實例生成后,用then方法來指定兩種狀態(tài)的回調(diào)函數(shù)。舉一個簡單例子

//axios是一個基于Promise的http請求,可以直接調(diào)用then

this.axios.get(url).then((res)=>{
        //請求成功 resolved的回調(diào)
    },(err)=>{
        //請求失敗 rejected的回調(diào)
    })
})
將多個Promise封裝成一個

假如你需要等待多個Promise請求resoved后在執(zhí)行,可以調(diào)用Promise.all()
這個api接受一個promise實例數(shù)組做參數(shù)。

手動實現(xiàn)Promise
//1.定義三種狀態(tài)
const PENDING = "pending"
const RESOLVED = "resolved"
const REJECTED = "rejected"
function MyPromisr(fn){
       //重命名this,防止接下來找不到正確的this
       const that = this
       that.state = PENDING //初始狀態(tài)為等待
       that.value = null //value用于保存resolved或rejoiced傳入的值
       that.resolvedCallbacks = [] //成功請求后的回調(diào)數(shù)組
       //定義完成的回調(diào)函數(shù)
       function resolved(value) {
            // 只有在等待狀態(tài)才可以改變狀態(tài)
            if (that.state === PENDING) {
                that.state = RESOLVED
                that.value = value
                that.resolvedCallbacks.map(cb => cb(that.value))
            }
        }
        //定義拒絕的回調(diào)函數(shù)
        function rejected(value) {
            // 只有在等待狀態(tài)才可以改變狀態(tài)
            if (that.state === PENDING) {
                that.state = REJECTED
                that.value = value
                that.rejectedCallbacks.map(cb => cb(that.value))
            }
        }
        // 定義了兩種狀態(tài)的回調(diào)函數(shù)后,執(zhí)行mypromise傳參的函數(shù)
        try {
            fn(resolved,rejected)
        } catch (e) {
            rejected(e)
        }
}
// 定義then
MyPromise.prototype.then = function(onFulfilled,onRejected){
    const that = this
    onFulfilled = typeof onFulfilled === "function" ? onFulfilled :v => v
    onRejected = 
     typeof onRejected === "function"
        ? onRejected
        : r => {
            throw r
        }
    if (that.state === PENDING) {
        that.resolvedCallbacks.push(onFulfilled)
        that.rejectedCallbacks.push(onRejected)
    }
    if (that.state === RESOLVED) {
        onFulfilled(that.value)
    }
    // console.log(that.state,"has change")
    if (that.state === REJECTED) {
        onRejected(that.value)
    }
}

//調(diào)用
new MyPromise((resolved,rejected) => {
    setTimeout(()=>{
        resolved(1)
        rejected(2)
    },0)
}).then(value=>{
    console.log(value)
},value=>{
    console.log(value)
})

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/105210.html

相關(guān)文章

  • 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
  • 22道JavaScript高頻手寫面試題

    JavaScript筆試部分 點擊關(guān)注本公眾號獲取文檔最新更新,并可以領(lǐng)取配套于本指南的 《前端面試手冊》 以及最標準的簡歷模板. 實現(xiàn)防抖函數(shù)(debounce) 防抖函數(shù)原理:在事件被觸發(fā)n秒后再執(zhí)行回調(diào),如果在這n秒內(nèi)又被觸發(fā),則重新計時。 那么與節(jié)流函數(shù)的區(qū)別直接看這個動畫實現(xiàn)即可。 showImg(https://segmentfault.com/img/remote/146000002...

    Alan 評論0 收藏0
  • 3行代碼實現(xiàn)一個簡易promise

    前言 作為一個后端過來的同學,剛?cè)腴T前端的時候,被js種種「反人類」的概念折騰的死去活來的.其中一個印象比較深刻的,就是promise,感覺實在太難理解了...所有就有了寫個簡單的promise的想法.希望能幫助到一些跟我一樣,感覺promise很難理解的新同學. promise的教程網(wǎng)上多如牛毛,其中寫的比較通俗易懂的莫過于阮一峰的es6,反正我是他的書才懂的.所以今天,我們也不會來復述一遍如何...

    ralap 評論0 收藏0
  • 「中高級前端面試」JavaScript手寫代碼無敵秘籍

    摘要:第一種直接調(diào)用避免在不必要的情況下使用,是一個危險的函數(shù),他執(zhí)行的代碼擁有著執(zhí)行者的權(quán)利。來自于此外,實現(xiàn)需要考慮實例化后對原型鏈的影響。函數(shù)柯里化的主要作用和特點就是參數(shù)復用提前返回和延遲執(zhí)行。手寫路徑導航 實現(xiàn)一個new操作符 實現(xiàn)一個JSON.stringify 實現(xiàn)一個JSON.parse 實現(xiàn)一個call或 apply 實現(xiàn)一個Function.bind 實現(xiàn)一個繼承 實現(xiàn)一個J...

    Zhuxy 評論0 收藏0
  • What's New in JavaScript

    摘要:在和中都保留了數(shù)組的強引用,所以在中簡單的清除變量內(nèi)存并沒有得到釋放,因為還存在引用計數(shù)。而在中,它的鍵是弱引用,不計入引用計數(shù)中,所以當被清除之后,數(shù)組會因為引用計數(shù)為而被回收掉。其實我們主要注意的引用是不計引用計數(shù)的,就好理解了。 showImg(https://segmentfault.com/img/remote/1460000019147368?w=900&h=383); 前...

    cgh1999520 評論0 收藏0

發(fā)表評論

0條評論

LMou

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<