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