摘要:是一種異步編程規(guī)范音譯來(lái)理解普羅米修斯。普羅米修斯是希臘神話故事中的英雄,名字的意思是先知。最初的命名是未來(lái),可見(jiàn)含義不是字面的誓言承諾之類,而是先知未來(lái)的意思。
promise 是一種異步編程規(guī)范,音譯來(lái)理解——“普羅米修斯”。普羅米修斯是希臘神話故事中的英雄,名字的意思是“先知”。Promise最初的命名是Futures, “未來(lái)”,可見(jiàn)Promise含義不是字面的“誓言”“承諾”之類,而是“先知”“未來(lái)”的意思。
promise的出現(xiàn)是為了解決 異步編程中最頭疼的事情 回調(diào)嵌套地域
動(dòng)畫回調(diào)金字塔:
$("xx").animate({}, function(){ //do something $("xx").animate({},function(){ //do something $("xx").animate({},function(){ //do something $("xx").animate({},function(){ //do something $("xx").animate({},function(){ //do something },1000); },1000); },1000); },1000); },1000);
看到這樣的代碼,其實(shí)強(qiáng)迫癥已經(jīng)犯了. 以上就是 從代碼的視角去看問(wèn)題.
好了現(xiàn)在我們換個(gè)角度 去看這個(gè)問(wèn)題. 切換到上帝視角
$("xx").animate({}) //動(dòng)畫1 之后 .then(function(){ return $("xx").animate({}); }) //動(dòng)畫2 之后 .then(function(){ return $("xx").animate({}); }) //動(dòng)畫3 之后 .then(function(){ return $("xx").animate({}); }) //動(dòng)畫4 之后 .then(function(){ return $("xx").animate({}); }) //動(dòng)畫完成 .done(function(){ console.log("動(dòng)畫完成...") }) //動(dòng)畫失敗 .fail(function(){ console.log("動(dòng)畫出錯(cuò)...") });
是不是非常 清晰流暢 這就是 同步編寫異步執(zhí)行 所帶來(lái)的魅力
這種模式被稱作promise模式 我們可以理解為
現(xiàn)實(shí)世界里,時(shí)間這條線就是單線程的,不會(huì)出現(xiàn)兩條時(shí)間線,這種事是會(huì)出現(xiàn)在科幻故事里. 如果我們的 人生 = 代碼
那么上帝已經(jīng)在他的時(shí)間維度的一瞬間規(guī)劃好了你的一生(因?yàn)樗邢戎哪芰Γㄋ麩o(wú)需跟著經(jīng)歷你的時(shí)間),雖然你自己依然感受到了時(shí)間,以及各種變數(shù)
更多詳細(xì)代碼哲學(xué) 請(qǐng)看這篇文章
http://www.zhangxinxu.com/wor...
現(xiàn)實(shí)中的例子 :
你求 別人辦事 別人給了你句答復(fù)20分鐘后 來(lái)拿結(jié)果 這個(gè)答復(fù) 就是 promise 在20分鐘內(nèi) 你可以去做別的事情 20分鐘后你拿這個(gè)promise 找到那個(gè)人 兌現(xiàn)承諾.
promise 就是未來(lái)的值
在jq中 提供的$.deferred對(duì)象 就是實(shí)現(xiàn)promise的解決方案.,defer的意思是"延遲",所以deferred對(duì)象的含義就是"延遲"到未來(lái)某個(gè)點(diǎn)再執(zhí)行。
deferred對(duì)象有三種執(zhí)行狀態(tài)
未完成(notify)
已完成(resolve)
已失敗(reject)
當(dāng)deferred對(duì)象狀態(tài)發(fā)生變化 比如
變成resolve deferred對(duì)象立刻調(diào)用done()方法指定的回調(diào)函數(shù)
變成reject調(diào)用fail()方法指定的回調(diào)函數(shù);
變成 notify 則繼續(xù)等待,或者調(diào)用progress()方法指定的回調(diào)函數(shù)
這是不能直接 返回deferred對(duì)象 因?yàn)檫@個(gè)deferred對(duì)象 可以隨意被修改狀態(tài),因此我門需要返回一個(gè) 不能修改狀態(tài)的promise
deferred.promise() : 返回一個(gè)新的deferred對(duì)象,該對(duì)象的運(yùn)行狀態(tài)無(wú)法被改變
所以我們的promise規(guī)范的模版
//創(chuàng)建 var fnxx = function(){ var defer = $.Deferred(); //業(yè)務(wù)代碼.... //條件 if(xxxx) //成功 defer.resolve(//成功返回值); else //失敗 defer.reject(//失敗返回error); return defer.promise(); } //調(diào)用 fnxx() .done(function(success){ }) .fail(function(error){ });業(yè)務(wù)案例
有如下需求
登錄獲得token
根據(jù)token查詢用戶信息
根據(jù)userId查詢用戶積分
根據(jù)積分判斷用戶是否需要充值
代碼如下 :
//登錄獲得token login(userName,passWord) //獲得用戶信息(根據(jù)token) .then(function(loginUser){ return getUserInfo(loginUser.token); }) //獲得積分(根據(jù)用戶id) .then(function(userInfo){ return getCredit(userInfo.userId); }) //是否需要充值 .then(function(credit){ return isRecharge(credit); }) //最后結(jié)果 .done(function(isRe){ console.log(isRe); if(isRe == 0){ alert("不需要充值!"); } else if(isRe == 1){ alert("請(qǐng)充值"); } else{ console.log("錯(cuò)誤!"); } }) //任意一步 出現(xiàn)錯(cuò)誤 .fail(function(ob,name,error){ console.error(error.stack); });
業(yè)務(wù)邏輯清晰自然 我們必須要學(xué)會(huì) 站在上帝視角 審視它們. 只有這樣才能輕松駕馭它們 成為Dominate
源代碼git https://github.com/sherlock22...
參考
http://www.ruanyifeng.com/blo...
http://www.zhangxinxu.com/wor...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/90129.html
摘要:而小程序官方的是在中調(diào)用方法來(lái)改變數(shù)據(jù),從而改變界面。為了寫測(cè)試讓咱們來(lái)重構(gòu)一把,利用學(xué)習(xí)過(guò)的函數(shù)式編程中的高階函數(shù)把依賴注入。也就是說(shuō)當(dāng)中的某個(gè)數(shù)據(jù)更新的時(shí)候,我們并不知道它會(huì)影響哪個(gè)中的屬性,特別的還有依賴于的情況。 眾所周知 Vue 是借助 ES5 的 Object.defineProperty 方法設(shè)置 getter、setter 達(dá)到數(shù)據(jù)驅(qū)動(dòng)界面,當(dāng)然其中還有模板編譯等等其他...
開(kāi)門見(jiàn)山地說(shuō),小程序在日常開(kāi)發(fā)中使用原生框架來(lái)開(kāi)發(fā)還是挺不方便的,比如: 不支持 npm 包 不支持各種 CSS 預(yù)編譯器 不支持配置 Babel 來(lái)轉(zhuǎn)換一些 JavaScript 新特性 這樣一來(lái)和日常開(kāi)發(fā)前端頁(yè)面的體驗(yàn)相比來(lái)說(shuō),簡(jiǎn)直就像在刀耕火種。 那么為了解決這些問(wèn)題,我們能不能將前端開(kāi)發(fā)中常用的 webpack 移植到小程序開(kāi)發(fā)中呢? 當(dāng)然可以! showImg(https://seg...
摘要:在今年的云棲大會(huì)上,阿里巴巴人工智能實(shí)驗(yàn)室除了發(fā)布服務(wù)機(jī)器人天貓精靈太空蛋太空梭天貓精靈車載版,還重點(diǎn)推出了車路協(xié)同智能自動(dòng)駕駛車。秒看懂智慧物流車和感知基站各位嘉賓,上午好我是王剛,我要介紹的是自動(dòng)駕駛從單車智能跨到協(xié)同智能的進(jìn)化。 在今年的云棲大會(huì)上,阿里巴巴人工智能實(shí)驗(yàn)室除了發(fā)布AliGenie 3.0、服務(wù)機(jī)器人(天貓精靈太空蛋、太空梭)、天貓精靈車載版(TmallGenie ...
摘要:在今年的云棲大會(huì)上,阿里巴巴人工智能實(shí)驗(yàn)室除了發(fā)布服務(wù)機(jī)器人天貓精靈太空蛋太空梭天貓精靈車載版,還重點(diǎn)推出了車路協(xié)同智能自動(dòng)駕駛車。秒看懂智慧物流車和感知基站各位嘉賓,上午好我是王剛,我要介紹的是自動(dòng)駕駛從單車智能跨到協(xié)同智能的進(jìn)化。 在今年的云棲大會(huì)上,阿里巴巴人工智能實(shí)驗(yàn)室除了發(fā)布AliGenie 3.0、服務(wù)機(jī)器人(天貓精靈太空蛋、太空梭)、天貓精靈車載版(TmallGenie ...
摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。寫一個(gè)符合規(guī)范并可配合使用的寫一個(gè)符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來(lái)處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問(wèn)題描述 在開(kāi)發(fā)過(guò)程中,遇到一個(gè)需求:在系統(tǒng)初始化時(shí)通過(guò)http獲取一個(gè)第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個(gè)接口,可通過(guò)...
閱讀 1390·2021-11-15 18:11
閱讀 2517·2021-08-19 10:56
閱讀 686·2021-08-09 13:42
閱讀 800·2019-08-30 15:53
閱讀 2093·2019-08-30 10:55
閱讀 3150·2019-08-29 17:18
閱讀 1444·2019-08-29 13:45
閱讀 554·2019-08-29 13:15