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