摘要:如果對象已經處于狀態,調用方法會立即執行回調函數。好多庫中實現叫,對象是用來操作對象修改對象狀態,而對象本身只提供方法添加回調函數以及其他添加回調函數的方法,不提供操作對象的方法,這樣設計使得對象對外不可修改,詳細參考實現。
1. 異步編程
JS是單線程執行了,通過event loop實現了非阻塞的I/O。編程中經常用異步回調函數的方式處理I/O的反饋結果(網絡請求,用戶交互事件)。如分別發送兩個請求:
function xhrRequest(url, callback) { setTimeout(function(){ // 用setTimeout模擬異步請求 callback(); }, 0) } xhrRequest("/index", function(){ console.log("request /index done"); }) xhrRequest("/list", function(){ console.log("request /list done"); })
但如果想在請求index后再請求list怎么辦呢?,可能會這樣寫:
xhrRequest("/index", function(){ console.log("request /index done"); xhrRequest("/list", function(){ // 回調函數里,再次回調 console.log("request /list done"); }) })
但是如果有3個或4個異步請求有先后依賴怎么呢?回調函數會一直嵌套回調函數(callback hell),代碼看起來亂糟糟的,并且不好維護。事件模式也不能很好處理這些,急需其他能降低異步編程復雜性的方式。
2. promise模式 2.1 promise A+Promise已經是個標準了,最新的是Promise A+標準。標準中給Promise的定義是:"A promise represents the eventual result of an asynchronous operation"。即Promise表示一個異步操作的最終結果。主要通過Promise對象的then方法和Promise對象進行交互:注冊失敗,成功回調函數,并且失敗回調函數接收一個失敗原因(reason)參數,成功回調函數接收一個值(value)參數。Promise A+標準主要是定義then方法的規范。
2.1.1 Promise對象狀態Promise對象有三種狀態:Pending(待定),Fullfilled(已完成),Rejected(已拒絕)。
A:Pending的Promise對象可以轉成Fullfilled或者Rejected
B:Fullfilled的Promise對象不能轉成其他狀態,并且必須含有一個值(value),該值不能變。
C:Rejected的Promise對象不能轉成其他狀態,并且必須含有一個原因對象(reason)表示失敗的原因,該值不能變。
then方法的規范很多,認真讀讀標準。但要主要下面幾點:
A:每個回調函數只能執行一次。
B:多次調用then方法,可以注冊多個回調函數,回調函數的調用順序取決于調用then方法的順序。如果Promise對象已經處于fullfilled/ rejected狀態,調用then方法會立即執行onfullfilled/onRejected回調函數。
C:then方法必須返回個Promise對象: Promise2 = Promse1.then(onFullfilled, onRejected)。但沒規定Promise1和Promise2是否相等,這個要看具體的實現了。
then方法返回一個Promise對象,這樣就構成一個then鏈。前面的Promise對象的狀態變化對后面的Promise對象的狀態的影響稱為Promise解決程序(The Promise Resolution Procedure)。
2.2 Promise標準實現實現Promise標準的庫和框架有很多了,jQuery,Zeptojs,ES6等。好多庫中Promise實現叫Deferred,Deferred對象是用來操作Promise對象(修改Promise對象狀態),而Promise對象本身只提供then方法添加回調函數(以及其他添加回調函數的方法),不提供操作Promise對象的方法,這樣設計使得Promise對象對外不可修改,詳細參考ZeptoJS Deferred實現。
2.3 為什么Promise模式重要Promise是把類似的異步處理對象和處理規則進行規范化, 并按照采用統一的接口來編寫,而采取規定方法之外的寫法都會出錯。這樣更有利理解,維護。將復雜的異步處理輕松地進行模式化。
參考異步編程
Promise A+標準
promises 很酷,但很多人并沒有理解就在用了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93322.html
摘要:源碼閱讀階段先理解根本吧想快點理解的話可以直接跳到下個標題這部分根據理解將持續修改空函數用于判斷傳入構造器的函數是否為空函數如果為空函數構造一個對象并初始化狀態為終值回調狀態和隊列記錄內部最后的一次錯誤空對象標識表示發生了錯誤暴露模塊接口為 源碼閱讀階段 先理解Promise根本吧,想快點理解的話可以直接跳到下個標題.這部分根據理解將持續修改. Promise(fn) function...
摘要:小程序的視圖層目前使用作為渲染載體,而邏輯層是由獨立的作為運行環境。比如小程序的,通信一次就像是寫情書所以,嚴格來說,小程序是微信定制的混合開發模式。出棧入棧解決小程序接口不支持的問題小程序的所有接口,都是通過傳統的回調函數形式來調用的。 作者:張利濤,視頻課程《微信小程序教學》、《基于Koa2搭建Node.js實戰項目教學》主編,滬江前端架構師本文原創,轉載請注明作者及出處 小程...
摘要:近幾年隨著開發模式的逐漸成熟,規范順勢而生,其中就包括提出了規范,完全改變了異步編程的寫法,讓異步編程變得十分的易于理解。最后,是如此的優雅但也只是解決了回調的深層嵌套的問題,真正簡化異步編程的還是,在端,建議考慮。 本篇,簡單實現一個promise,主要普及promise的用法。 一直以來,JavaScript處理異步都是以callback的方式,在前端開發領域callback機制...
摘要:首先我們需要要記住,以太坊是由共享同一份數據的相同拷貝的節點構成的。你可以運行你自己的以太坊節點來作為。在你部署智能合約以后,它將獲得一個以太坊上的永久地址。如果你還記得第二課,在以太坊上的地址是。 通過前邊的學習,DApp 的 Solidity 合約部分就完成了。現在我們來做一個基本的網頁好讓你的用戶能玩它。 要做到這一點,我們將使用以太坊基金發布的 JavaScript 庫 —— ...
摘要:近幾年隨著開發模式的逐漸成熟,規范順勢而生,其中就包括提出了規范,完全改變了異步編程的寫法,讓異步編程變得十分的易于理解。最后,是如此的優雅但也只是解決了回調的深層嵌套的問題,真正簡化異步編程的還是,在端,建議考慮。 前段時間頻頻看到Promise這個詞,今天發現騰訊AlloyTeam寫得這篇很贊,遂轉之。 原文鏈接 本篇,主要普及promise的用法。 一直以來,JavaScrip...
閱讀 1019·2022-07-19 10:19
閱讀 1794·2021-09-02 15:15
閱讀 1007·2019-08-30 15:53
閱讀 2653·2019-08-30 13:45
閱讀 2652·2019-08-26 13:57
閱讀 1983·2019-08-26 12:13
閱讀 1006·2019-08-26 10:55
閱讀 545·2019-08-26 10:46