国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

promise學(xué)習(xí)1-promise特點(diǎn),手寫簡(jiǎn)易版promise

這篇具有很好參考價(jià)值的文章主要介紹了promise學(xué)習(xí)1-promise特點(diǎn),手寫簡(jiǎn)易版promise。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.promise特點(diǎn)

1.promise有三個(gè)狀態(tài) 成功態(tài)(resolve) 失敗態(tài)(reject) 等待態(tài)(pending)(既不成功也不失?。?br> 舉個(gè)例子,女友叫你給她買包 買 不買 不說(shuō)話
promise就是一個(gè)類,所以要new。promise默認(rèn)為pending狀態(tài)。
2.用戶自己決定成功和失敗的原因,也決定最后是否成功還是失敗

 let promise =  new Promise((resolve, reject) => {
//意思就是這里可以寫業(yè)務(wù)代碼,自己決定什么情況是失敗什么是成功
 })
 console.log(promise)

3.promise默認(rèn)執(zhí)行器立即執(zhí)行 !!!

let promise =  new Promise((resolve, reject) => {
console.log(1)
})
console.log(2)
//結(jié)果是1,2 

4.Promise的實(shí)例都有一個(gè)then方法,一個(gè)參數(shù)是成功的回調(diào),一個(gè)是失敗的回調(diào)

let promise = new Promise((resolve, reject) => {
   console.log(1)
   // resolve('成功')
})
promise.then((data) => {
   console.log('success', data)
}, (err) => {
   console.log('fail', err)
})
//結(jié)果 1

這里既沒(méi)有拋出成功也沒(méi)有拋出失敗,所以不會(huì)執(zhí)行后面的相關(guān)回調(diào)。
5.如果執(zhí)行函數(shù)是發(fā)生了異常也會(huì)執(zhí)行錯(cuò)誤的邏輯

let promise = new Promise((resolve, reject) => {
  throw new Error('失敗了');
})
promise.then((data) => {
   console.log('success', data)
}, (err) => {
   console.log('fail', err)
})
//結(jié)果 : fail 失敗了

6.promise一旦成功了就不能失敗了,一旦失敗了就不能成功了

2.手寫promise

根據(jù)上面的特點(diǎn)手寫promise

2.1簡(jiǎn)單的promise


const RESOLVE = 'RESOLVE';
const REJECT = 'REJECT';
const PENDING = 'PENDING';
class Promise {
   constructor(executor) {
      this.status = PENDING;
      this.value = undefined;
      this.reason = undefined;
      //resolve和reject不屬于實(shí)例上的
      let resolve = (value) => {
         if (this.status === PENDING) {
            this.value = value;
            this.status = RESOLVE;
         }
      }
      let reject = (reason) => {
         if (this.status === PENDING) {
            this.reason = reason;
            this.status = REJECT;
         }
      }
      try {
         executor(resolve, reject); //立即執(zhí)行并傳入resolve和reject
      } catch (error) {
         //錯(cuò)誤處理 就直接走錯(cuò)誤邏輯
         reject(error);
      }
   }
   then(onFufilled, onRejected) {
      if (this.status === RESOLVE) {
         onFufilled(this.value)
      }
      if (this.status === REJECT) {
         onRejected(this.reason)
      }
   }
}

2.2promise的then方法

但是上面的then方法是有缺陷的,處理有異步的方法是有問(wèn)題的,例如執(zhí)行下面的代碼就會(huì)出問(wèn)題

let Promise = require('./promise')
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
     resolve(1)
}, 1000);
})
promise.then((data) => {
   console.log('success', data)
}, (err) => {
   console.log('fail', err)
})

代碼執(zhí)行的結(jié)果是什么都不會(huì)打印出來(lái)的
因?yàn)閠hen方法里剛開始的狀態(tài)是pending,但是之前的代碼中是沒(méi)有對(duì)狀態(tài)為pending的進(jìn)行處理的,所以是不會(huì)有什么邏輯走的,而且1秒過(guò)后狀態(tài)變?yōu)閞esolve,但是又不會(huì)再執(zhí)行方法了的。
所以我們需要做的就是第一,把pending狀態(tài)的進(jìn)行區(qū)分;第二,等轉(zhuǎn)換為resolve或則reject狀態(tài)的話還能在執(zhí)行then方法。
第二種我們要使用發(fā)布訂閱模式。
將上述代碼改造:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-552142.html

const RESOLVE = 'RESOLVE';
const REJECT = 'REJECT';
const PENDING = 'PENDING';
class Promise {
   constructor(executor) {
      this.status = PENDING;
      this.value = undefined;
      this.reason = undefined;
      this.onResolvedCallbacks = []; //用來(lái)存放成功的回調(diào)
      this.onREjectedCallbacks = []; //用來(lái)存放失敗的回調(diào)

      //resolve和reject不屬于實(shí)例上的
      let resolve = (value) => {
         if (this.status === PENDING) {
            this.value = value;
            this.status = RESOLVE;
            this.onResolvedCallbacks.forEach(fn => fn())
         }
      }
      let reject = (reason) => {
         if (this.status === PENDING) {
            this.reason = reason;
            this.status = REJECT;
            this.onREjectedCallbacks.forEach(fn => fn())
         }
      }
      try {
         executor(resolve, reject); //立即執(zhí)行并傳入resolve和reject
      } catch (error) {
         //錯(cuò)誤處理 就直接走錯(cuò)誤邏輯
         reject(error);
      }
   }
   then(onFufilled, onRejected) {
      if (this.status === RESOLVE) {
         onFufilled(this.value)
      }
      if (this.status === REJECT) {
         onRejected(this.reason)
      }
      if(this.status === PENDING){
         this.onResolvedCallbacks.push(() =>{
            onFufilled(this.value)
         })
         this.onREjectedCallbacks.push(() =>{
            onRejected(this.reason)
         })
         console.log('等待')
      }
   }
}

module.exports = Promise

到了這里,關(guān)于promise學(xué)習(xí)1-promise特點(diǎn),手寫簡(jiǎn)易版promise的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [JavaScript理論學(xué)習(xí)] 什么是Promise (含如何判斷一個(gè)值是Promise)

    本文旨在對(duì) Promise 的規(guī)范進(jìn)行解釋, 便于讀者在學(xué)習(xí) Promise 的過(guò)程中梳理 Promise 之間的操作關(guān)系, 不對(duì)具體的代碼實(shí)現(xiàn)和Promise用法進(jìn)行解釋. 比如, 為什么 [MDN-await] 中要提及一個(gè) thenable 對(duì)象, 而且這個(gè) thenable 對(duì)象 還可以和 Promise 實(shí)例 一樣使用 await 等待處理, 這就涉及到了下面

    2024年02月09日
    瀏覽(21)
  • 深入學(xué)習(xí)JavaScript系列(七)——Promise async/await generator

    深入學(xué)習(xí)JavaScript系列(七)——Promise async/await generator

    本篇屬于本系列第七篇 第一篇:#深入學(xué)習(xí)JavaScript系列(一)—— ES6中的JS執(zhí)行上下文 第二篇:# 深入學(xué)習(xí)JavaScript系列(二)——作用域和作用域鏈 第三篇:# 深入學(xué)習(xí)JavaScript系列(三)——this 第四篇:# 深入學(xué)習(xí)JavaScript系列(四)——JS閉包 第五篇:# 深入學(xué)習(xí)JavaScrip

    2023年04月08日
    瀏覽(33)
  • 【手寫promise——基本功能、鏈?zhǔn)秸{(diào)用、promise.all、promise.race】

    【手寫promise——基本功能、鏈?zhǔn)秸{(diào)用、promise.all、promise.race】

    關(guān)于動(dòng)機(jī),無(wú)論是在工作還是面試中,都會(huì)遇到Promise的相關(guān)使用和原理,手寫Promise也有助于學(xué)習(xí)設(shè)計(jì)模式以及代碼設(shè)計(jì)。 本文主要介紹了如何使用自己的代碼去實(shí)現(xiàn)Promise的一些功能。 以下是本篇文章正文內(nèi)容 手寫之前,需要知道promise有哪些基本特性: 1、promise有三種狀態(tài)

    2024年02月11日
    瀏覽(18)
  • 手寫Promise的基本實(shí)現(xiàn) (超詳細(xì))

    目錄 一:首先分析官方的promise 二:手寫Promise-then方法設(shè)計(jì) 三:then方法優(yōu)化: 四:Promise-catch方法設(shè)計(jì) ?五:Promise-finally方法設(shè)計(jì) //本文帶大家實(shí)現(xiàn)一個(gè)基本的 promise 過(guò)多的邊界情況就不在考虐,理解主要實(shí)現(xiàn)過(guò)程以及邏輯即可 //對(duì)于一個(gè)個(gè)出現(xiàn)的問(wèn)題?我會(huì)逐步分析原因以及

    2024年02月16日
    瀏覽(21)
  • 手寫簡(jiǎn)易操作系統(tǒng)(十七)--編寫鍵盤驅(qū)動(dòng)

    手寫簡(jiǎn)易操作系統(tǒng)(十七)--編寫鍵盤驅(qū)動(dòng)

    上一節(jié)我們實(shí)現(xiàn)了鎖與信號(hào)量,這一節(jié)我們就可以實(shí)現(xiàn)鍵盤驅(qū)動(dòng)了,訪問(wèn)鍵盤輸入的數(shù)據(jù)也屬于臨界區(qū)資源,所以需要鎖的存在。 之前的 ps/2 鍵盤使用的是中斷驅(qū)動(dòng)的,在當(dāng)時(shí),按下鍵盤就會(huì)觸發(fā)中斷,引導(dǎo)操作系統(tǒng)去處理這個(gè)按鍵行文。但是當(dāng)今的usb鍵盤,使用的是輪詢機(jī)

    2024年04月26日
    瀏覽(21)
  • 【Spring專題】手寫簡(jiǎn)易Spring容器過(guò)程分析

    【Spring專題】手寫簡(jiǎn)易Spring容器過(guò)程分析

    首先必須得聲明的是,下面的流程并不代表Spring源碼中真正的流程。而是,我們通過(guò)現(xiàn)在的Spring提供給我們的某些基礎(chǔ)功能,反推過(guò)來(lái)的流程。所以,并不全面,但是會(huì)具有一點(diǎn)參考性。 由于Spring源碼分析是一個(gè)前后聯(lián)系比較強(qiáng)的過(guò)程,而且這邊分析,也是按照代碼順序講解

    2024年02月13日
    瀏覽(37)
  • JavaScript Promise

    JavaScript Promise 是一種用于處理異步操作的對(duì)象。它表示一個(gè)異步操作的最終完成或失敗,并且可以處理操作的結(jié)果或錯(cuò)誤。 Promise 對(duì)象有三種狀態(tài): 1. Pending(進(jìn)行中):初始狀態(tài),表示操作正在進(jìn)行中,既不是成功也不是失敗。 2. Fulfilled(已完成):表示操作成功完成,并

    2024年02月06日
    瀏覽(22)
  • 深入理解 JavaScript Promise

    深入理解 JavaScript Promise

    JavaScript中的Promise是一種處理異步操作的機(jī)制,它提供了一種優(yōu)雅的方式來(lái)處理回調(diào)函數(shù)地獄和異步代碼的流程控制。本文將深入介紹JavaScript中的Promise,幫助讀者更好地理解和應(yīng)用Promise。 Promise是一個(gè)代表異步操作的對(duì)象,它可以有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已

    2024年02月09日
    瀏覽(25)
  • JavaScript 之 promise

    JavaScript 之 promise

    封裝和調(diào)用不是同一個(gè)人,不清楚如何調(diào)用 設(shè)計(jì)者不好設(shè)計(jì),調(diào)用者調(diào)用很麻煩 從一個(gè)實(shí)際的例子來(lái)作為切入點(diǎn): 調(diào)用一個(gè)函數(shù),這個(gè)函數(shù)中發(fā)送網(wǎng)絡(luò)請(qǐng)求(可以用定時(shí)器來(lái)模擬) 如果發(fā)送網(wǎng)絡(luò)請(qǐng)求成功了,那么告知調(diào)用者發(fā)送成功,并且將相關(guān)數(shù)據(jù)返回過(guò)去 如果發(fā)送網(wǎng)

    2024年01月21日
    瀏覽(17)
  • JavaScript如何解決返回[object Promise]

    當(dāng)使用JavaScript中的Promise時(shí),當(dāng)您嘗試訪問(wèn)Promise的值時(shí),您可能會(huì)看到返回值為 [object Promise] 的情況。這是因?yàn)镻romise是一種異步操作,它不能立即返回結(jié)果,而是需要等待操作完成后返回結(jié)果。 要訪問(wèn)Promise的值,您需要使用Promise的then()方法,該方法接受一個(gè)回調(diào)函數(shù)作為參

    2024年02月12日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包