日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

方法 手写promise_高级前端养成37js专精06之手写promise(上)

發布時間:2024/9/30 HTML 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 方法 手写promise_高级前端养成37js专精06之手写promise(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 面試答題萬金油方法論順序(高級前端面試套路)
    • 該技術要解決什么問題-why
    • 該技術是怎么解決它的-how
    • 該技術有什么優點(對比其他技術) - pros
    • 該技術有什么缺點-cons
    • 如何解決這些缺點-more
  • promise 要解決什么問題
    • 要解決回調地獄

    • 那么問題來了,回調地獄真的是個問題么?

    • 有沒有可能是這個程序員水平不行

      • 回調地獄案例
    回調地獄
    • 改寫成回調不地獄
    回調不地獄
  • 現狀水平差的人就是多
    • 即 Promise 解決了回調地獄的問題
  • Promise 有什么優點
    • 有兩個主要的優點
      • 把【函數里的函數】編程【then 下面的 then】(鏈式)
  • 減少縮進
  • 減少縮進1/2減少縮進2/2
      • 錯誤處理單獨放到一個函數里
      • 如果不處理,就一直等到往后拋
  • 消滅 if(err)
  • 消滅if err
  • 用戶怎么用 Promise
    • 用回調的方式搖骰子
    搖骰子回調
    • 用 Promise 的方式搖骰子
    搖骰子promise
  • Promise 的完整 API 是什么?
    • Promise 是一個類
      • JS 里類是特殊的函數
      • 類屬性: length(可忽略)
      • 類方法: all/allSettled/race/reject/resolve
      • 對象屬性: then(重要)/finally/catch
      • 對象內部屬性: state=pending/fulfilled/reject
  • API 的規則是什么
    • Promise/A+規格文檔
      • JS 的 Promise 的公開標準
      • 有中文翻譯,但是不保證其準確性
    • 開始寫代碼
      • 按照文檔寫測試用例
      • 先讓用例失敗
      • 然后讓用例通過
      • 直到把文檔的所有情況都考慮清楚
  • 使用 chai
    • 更牛 X 的測試方案
      • 之前的手寫用例太原始了,不利于定位錯誤
    • 步驟
      • yarn global add ts-node mocha 全局安裝
      • 創建目錄 promise-demo(名字隨意)
      • yarn init -y 或者 npm init -y
      • yarn add chai mocha --dev
      • yarn add @types/chai @types/mocha --dev
      • 創建 test/index.ts
      • mocha -r ts-node/register test/index.ts 運行測試
    // 測試起手代碼import * as chai from "chai";const assert = chai.assert;describe("", () => { it("", () => {});});
    • describe,it 的意思見下圖
    • 確認 mocha 可以成功使用
    describe("Promise", () => { it("可以測試相等", () => { assert(1 === 1); });});
    • 然后輸入mocha -r ts-node/register test/index.ts 運行測試
    • mocha 的作用就是提供 describe,it 和漂亮的輸出的一個庫
    • chai 就是提供 assert 的使用
    • 在 package.json 中配置,就不需要這么長命令了
    "scripts": { "test": "mocha -r ts-node/register test/**/*.ts" },
    • yarn test 發現報錯,因為 yarn 在本地找依賴,而 typescript 和 ts-node 是全局的,所以進行本地安裝,基本腳手架就搭建完成了
  • 新建 src/promise.ts,開始寫代碼,并完成第一個測試用例
  • describe("Promise", () => { it("是一個類", () => { // assert(typeof Promise === 'function'); // 檢測是不是函數 // assert(typeof Promise.prototype === "object"); // 檢測是不是對象 assert.isFunction(Promise); // chai.assert 可以對以上兩句的簡寫 assert.isObject(Promise.prototype); });});
  • 測試用例 2,new Promise() 必須接收一個函數,不是一個函數就報錯
  • // 測試用例describe("Promise", () => { it("是一個類", () => { // assert(typeof Promise === 'function'); // 檢測是不是函數 // assert(typeof Promise.prototype === "object"); // 檢測是不是對象 assert.isFunction(Promise); // chai.assert 可以對以上兩句的簡寫 assert.isObject(Promise.prototype); }); it("new Promise() 必須接收一個函數,不是一個函數就報錯", () => { assert.throw(() => { // assert.throw預測某個東西會報錯,接收一個函數 // @ts-ignore new Promise(1); // 函數體里就是要報錯的東西,這里的意思是預測new Promise會報錯 }); assert.throw(() => { // assert.throw預測某個東西會報錯,接收一個函數 // @ts-ignore new Promise(false); // 函數體里就是要報錯的東西,這里的意思是預測new Promise會報錯 }); });});// 源代碼class Promise2 { constructor(fn) { if (typeof fn !== "function") { throw new Error("我只接收函數"); } }}
  • 實現測試用例 3,new Promise(fn)會生成一個對象,對象有 then 方法
  • it("new Promise(fn)會生成一個對象,對象有then方法", () => { const promise = new Promise(() => {}); assert.isFunction(promise.then);});class Promise2 { constructor(fn) { if (typeof fn !== "function") { throw new Error("我只接收函數"); } } then() {}}export default Promise2;
  • 實現測試用例 4,new Promise(fn) 中的 fn 立即執行
  • it("new Promise(fn) 中的 fn 立即執行", () => { let called = false; const promise = new Promise(() => { called = true; }); // @ts-ignore assert(called === true);});class Promise2 { constructor(fn) { if (typeof fn !== "function") { throw new Error("我只接收函數"); } fn(); } then() {}}
  • 實現測試用例 5,new Promise(fn)中的 fn 執行的時候接收 resolve 和 reject 兩個函數
  • it("new Promise(fn)中的fn執行的時候接收 resolve 和 reject 兩個函數", () => { let called = false; const promise = new Promise((resolve, reject) => { called = true; assert.isFunction(resolve); assert.isFunction(reject); }); // @ts-ignore assert(called);});class Promise2 { constructor(fn) { if (typeof fn !== "function") { throw new Error("我只接收函數"); } fn( () => {}, () => {} ); } then() {}}
  • 測試用例 6,測試 promise.then(success)中的 success 會在 resolve 被調用的時候,執行。這里會涉及執行時機的問題,resolve 立即執行所引發的問題,resolve 執行的時候 then 還沒有綁定到 promise 上去
  • it("promise.then(success)中的success 會在 resolve被調用的時候,執行", (done) => { // done 表示等待的執行 let called = false; const promise = new Promise((resolve, reject) => { // 該函數沒有執行 assert(called === false); // 之前不是true console.log("resolve"); resolve(); assert(called === true); // resolve 之后是true,證明resolve()調用了succeed console.log("代碼執行了"); // 該函數執行了 }); // @ts-ignore promise.then(() => { called = true; });});class Promise2 { succeed = null; // 對象的屬性, 類的屬性要加static fail = null; resolve = () => { this.succeed(); }; reject = () => { this.fail(); }; constructor(fn) { if (typeof fn !== "function") { throw new Error("我只接收函數"); } fn(this.resolve.bind(this), this.reject.bind(this)); } then(succeed, fail) { this.succeed = succeed; // 存到對象的屬性上 this.fail = fail; }}
  • 通過增加 setTimeout 讓 resolve 等一會,并且不能立即去測試 assert 為 true,但是這樣做需要在測試用例上加上 done,因為有等待執行的代碼,done 的意思告訴 mocha 測試完了,可以檢查測試結果了。最終實現 promise.then(success)中的 success 會在 resolve 被調用的時候執行。
  • it("new Promise(fn)中的fn執行的時候接收 resolve 和 reject 兩個函數", () => { let called = false; const promise = new Promise((resolve, reject) => { called = true; assert.isFunction(resolve); assert.isFunction(reject); }); // @ts-ignore assert(called);});class Promise2 { succeed = null; // 對象的屬性, 類的屬性要加static fail = null; constructor(fn) { if (typeof fn !== "function") { throw new Error("我只接收函數"); } fn( () => { setTimeout(() => { this.succeed(); }, 0); }, () => { setTimeout(() => { this.fail(); }, 0); } ); } then(succeed, fail) { this.succeed = succeed; // 存到對象的屬性上 this.fail = fail; }}
    • 優化代碼
    class Promise2 { succeed = null; // 對象的屬性, 類的屬性要加static fail = null; resolve = () => { setTimeout(() => { this.succeed(); }, 0); }; reject = () => { setTimeout(() => { this.fail(); }, 0); }; constructor(fn) { if (typeof fn !== "function") { throw new Error("我只接收函數"); } fn(this.resolve, this.reject); } then(succeed, fail) { this.succeed = succeed; // 存到對象的屬性上 this.fail = fail; }}
  • 使用 sinon 測試函數,sinon-chai 是讓 sinon 和 chai 合作
    • 安裝
      • yarn add sinon sinon-chai --dev
      • yarn add @types/sinon @types/sinon-chai --dev
    • 引入并使用 sinon-chai
    import * as sinon from "sinon";import * as sinonChai from "sinon-chai";chai.use(sinonChai);
    • 改寫之前的原始版代碼
    it("new Promise(fn) 中的 fn 立即執行", () => { let fn = sinon.fake(); const promise = new Promise(fn); assert(fn.called);});
    • 改寫測試代碼,把之前各種變量改寫成 sinon.fake
    it("new Promise(fn) 中的 fn 立即執行", () => { let fn = sinon.fake(); new Promise(fn); assert(fn.called);});it("new Promise(fn)中的fn執行的時候接收 resolve 和 reject 兩個函數", (done) => { new Promise((resolve, reject) => { assert.isFunction(resolve); assert.isFunction(reject); done(); });});it("promise.then(success)中的success 會在 resolve被調用的時候,執行", (done) => { // done 表示等待的執行 const success = sinon.fake(); const promise = new Promise((resolve, reject) => { // 該函數沒有執行 // assert(called === false); // 之前不是ture assert.isFalse(success.called); resolve(); setTimeout(() => { assert.isTrue(success.called); done(); }); // 該函數執行了 }); // @ts-ignore promise.then(success);});
  • 測試用例 7,測試 fail,和測試用例 6 對應
  • it("promise.then(null, fail)中的fail 會在 reject被調用的時候,執行", (done) => { // done 表示等待的執行 const fail = sinon.fake(); const promise = new Promise((resolve, reject) => { // 該函數沒有執行 // assert(called === false); // 之前不是ture assert.isFalse(fail.called); reject(); setTimeout(() => { assert.isTrue(fail.called); done(); }); // 該函數執行了 }); // @ts-ignore promise.then(null, fail);});
  • 接下來照著 PromiseA+規范做
    • 欲知后事如何,且聽下回分解

    總結

    以上是生活随笔為你收集整理的方法 手写promise_高级前端养成37js专精06之手写promise(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产va| 欧美激情网 | 懂色av蜜臀av粉嫩av分享吧最新章节 | 在线www色| 香蕉视频黄色在线观看 | 男人的天堂伊人 | 精品在线免费视频 | 亚洲国产精 | 小sao货cao死你 | 97免费人妻无码视频 | 国产喷白浆一区二区三区 | 青青草原国产在线观看 | 熟妇人妻系列aⅴ无码专区友真希 | 在线免费观看视频黄 | 欧美国产在线一区 | jjzz日本女人| 欧美日韩在线观看一区二区 | 在线成人免费观看 | 91精品国产高潮对白 | 少妇日韩| 国内精品久久久久久久久久 | 91麻豆国产 | 国产原创在线视频 | 粉嫩av网站 | 91精品啪在线观看国产 | 天堂一区二区三区 | 男人疯狂高潮呻吟视频 | 国内偷拍第一页 | 国产东北女人做受av | 婷婷麻豆 | www.三级.com| 中文字幕中出 | 小宝贝真紧h军人h | 高潮无码精品色欲av午夜福利 | 国产伦精品 | 国产又粗又猛又爽又 | av一卡| 国产粉嫩呻吟一区二区三区 | 久久亚洲AV成人无码国产野外 | 男生和女生一起差差差很痛的视频 | 亚洲欧美一区二区三区孕妇 | va婷婷在线免费观看 | 玖玖爱在线观看 | 一级少妇片 | 米奇影音 | 老头把女人躁得呻吟 | 播色屋 | 久久观看最新视频 | 国产成人无码精品久久 | 91网站在线免费观看 | 女儿的朋友4在线观看 | 亚洲aa | 天天狠天天透 | 日韩在线欧美 | 国产一区欧美二区 | 久久精品人妻av一区二区三区 | 无码人妻精品一区二区三区99日韩 | 蜜桃9999 | 欧美区亚洲区 | 在线免费观看亚洲 | 九九热在线精品 | 欧美熟妇精品一区二区蜜桃视频 | www.jizzcom | 亚色在线 | 久久久久亚洲av无码专区喷水 | 日本国产欧美 | 人人综合 | 亚洲午夜av | 奇米精品一区二区三区在线观看一 | 欧美一级在线观看 | 久久99久久久久 | 人妻丰满熟妇岳av无码区hd | 日本在线一本 | 狼人精品一区二区三区在线 | 伊人青青操 | 欧美一区一区 | 看av免费毛片手机播放 | 色婷婷综合久久久久中文一区二区 | 成人午夜在线播放 | 李丽珍毛片| 丁香婷婷久久久综合精品国产 | 精品久久影视 | 91精品国产入口在线 | 波多野结衣 久久 | 国产女合集 | 香蕉av在线播放 | 精品国产96亚洲一区二区三区 | 一区二区三区丝袜 | 天天干人人 | 日本久久中文字幕 | 色偷偷av男人的天堂 | 久久春色 | av在哪里看 | 无码精品视频一区二区三区 | av手机在线免费观看 | 精品人妻一区二区三区换脸明星 | 91香蕉在线看 | 91精产国品 | 精品国产自在精品国产精小说 |