摘要:揭示的編程技巧為什么能改善異步編程方法這主要是因?yàn)槌绦騿T編寫程序時(shí),總是按照自己的思考習(xí)慣和代碼組織習(xí)慣編寫程序,偏向于同步執(zhí)行過程。
先看一個(gè)例子
var Promise = require("promise-tiny"); new Promise(function(resolve, reject) { // 注意resolve和reject這兩個(gè)參數(shù),實(shí)際就是then和catch的參數(shù) var r = Math.random(); if(r >= 0.5) resolve("success"); else reject("fail"); }) .then(function(value) { // >=0.5時(shí),調(diào)用這個(gè)函數(shù) console.log(value); }) .catch(function(value) { // <0.5時(shí),調(diào)用這個(gè)函數(shù) console.log(value); });promise-tiny的實(shí)現(xiàn)代碼
class Promise { // 這段代碼主要用于揭示實(shí)現(xiàn)原理,對理解異步編程技巧很有幫助 constructor(factory) { this.flag = "Pending"; // flag值域 "Pending","Resolved","Rejected" this.args = []; this.func = {}; function next(flag, value) { // next這個(gè)函數(shù)是精華,factory沒有參數(shù)運(yùn)行起來,全靠它了 this.flag = flag; this.args = [].concat(value); this.func[flag] && this.func[flag].apply(undefined, this.args); } factory(next.bind(this, "Resolved"), next.bind(this, "Rejected")); } then(func) { if(this.flag==="Resolved") func.apply(undefined, this.args); else this.func["Resolved"] = func; return this; } catch(func) { if(this.flag==="Rejected") func.apply(undefined, this.args); else this.func["Rejected"] = func; return this; } }理解了原理,就覺得應(yīng)該能實(shí)現(xiàn)的更好。還是先看一個(gè)例子
var Steps = require("promise-tiny/Steps"); class Count { constructor() { this._step = 0; } get step() { return this._step; } set step(n) { this._step = n; } } new Steps(new Count) .on("Begin", function(next) { this.step++; next("check", "Begin"); }) .on("check", function(next, ...args) { this.step++; next("create", [].concat(args, "check")); }) .on("create", function(next, ...args) { this.step++; next("error", [].concat(args, "create")); }) .on("logout", function(next, ...args) { this.step++; next("End", [].concat(args, "logout")); }) .on("error", function(next, ...args) { this.step++; next("End", [].concat(args, "error")); }) .on("End", function(next, ...args) { this.step++; console.log("Steps: "+this.step, "trace: "+[].concat(args, "End").join("->")); next("new Steps", { id: "!Count", count: 0 }); }) .on("Begin", function(next, ...args) { this.count++; next("info", [].concat(args, "Begin")); }) .on("info", function(next, ...args) { this.count++; next("logout", [].concat(args, "info")); }) .on("logout", function(next, ...args) { this.count++; next("End", [].concat(args, "logout")); }) .on("error", function(next, ...args) { this.count++; next("End", [].concat(args, "error")); }) .on("End", function(next, ...args) { this.count++; console.log("Count: "+this.count, "trace: "+[].concat(args, "End").join("->"), this.id); });
結(jié)果
Steps: 5 trace: Begin->check->create->error->End Count: 4 trace: new Steps->Begin->info->logout->End !Count
Promise代碼體會(huì)
帶有一個(gè)函數(shù)參數(shù)的函數(shù) f1(f2) ,可以先造一個(gè)f2’,這樣就可以把它執(zhí)行了 f1(f2’)。
這個(gè)f2’的功能要這樣實(shí)現(xiàn):當(dāng)執(zhí)行到f2’時(shí),f2’要檢查真實(shí)的f2是否已經(jīng)準(zhǔn)備好了?如果準(zhǔn)備好了,就調(diào)用真實(shí)的f2;否則,要把調(diào)用f2的參數(shù)都記下來,等f2準(zhǔn)備好時(shí)調(diào)用。
這樣就不需要要求調(diào)用f1時(shí),f2必須準(zhǔn)備好了。但額外要提供一個(gè)提交f2的方法。
以上就是Promise揭示的異步編程技巧。在Promise中,factory是f1;resolve和reject是f2’;then和catch是提交f2的方法。
Promise揭示的編程技巧為什么能改善異步編程方法?
這主要是因?yàn)槌绦騿T編寫程序時(shí),總是按照自己的思考習(xí)慣和代碼組織習(xí)慣編寫程序,偏向于同步執(zhí)行過程。代碼的提交次序與機(jī)器執(zhí)行次序有著很大差異!Promise揭示的技巧使程序員能夠不用考慮機(jī)器的執(zhí)行次序,給點(diǎn)代碼就先執(zhí)行著,碰到?jīng)]給的代碼就記錄下來,等后續(xù)代碼提交后接著執(zhí)行。這樣,程序員只要保證最終把所有代碼都提交就可以了。
應(yīng)該有更好的實(shí)現(xiàn)
既然有這樣好的思路,再回頭看看Promise的實(shí)現(xiàn),其中缺陷不言而喻。Steps是一次嘗試,考慮的問題要比Promise多一些。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87739.html
摘要:學(xué)習(xí)開發(fā),無論是前端開發(fā)還是都避免不了要接觸異步編程這個(gè)問題就和其它大多數(shù)以多線程同步為主的編程語言不同的主要設(shè)計(jì)是單線程異步模型。由于異步編程可以實(shí)現(xiàn)非阻塞的調(diào)用效果,引入異步編程自然就是順理成章的事情了。 學(xué)習(xí)js開發(fā),無論是前端開發(fā)還是node.js,都避免不了要接觸異步編程這個(gè)問題,就和其它大多數(shù)以多線程同步為主的編程語言不同,js的主要設(shè)計(jì)是單線程異步模型。正因?yàn)閖s天生的與...
摘要:四異步編程解決方案模式模式一定程度上緩解了嵌套回調(diào)的問題,只會(huì)處在未完成完成態(tài)失敗態(tài)中的一種,只會(huì)從未完成轉(zhuǎn)化為完成態(tài)或者失敗態(tài),不能逆轉(zhuǎn)。 一、從一個(gè)簡單的案例開始 fs.readdir(path.join(__dirname, ./index.js), (err, files) => { files.foreach((filename, index) => { ...
摘要:接下來,我們一起來看看中的異步編程,具體有哪幾種。實(shí)現(xiàn)異步編程的方法一回調(diào)函數(shù)上面不止一次提到了回調(diào)函數(shù)。它是異步編程中,最基本的方法。四對象接下來,我們聊聊與相關(guān)的異步編程方法,對象。 showImg(https://segmentfault.com/img/bVbneWy?w=1600&h=1200); 前言 最近,小伙伴S 問了我一段代碼: const funB = (value...
摘要:為了降低異步編程的復(fù)雜性,所以。難理解請參考的誤區(qū)以及實(shí)踐異步編程的模式異步編程的種方法 異步編程 javascript異步編程, web2.0時(shí)代比較熱門的編程方式,我們平時(shí)碼的時(shí)候也或多或少用到,最典型的就是異步ajax,發(fā)送異步請求,綁定回調(diào)函數(shù),請求響應(yīng)之后調(diào)用指定的回調(diào)函數(shù),沒有阻塞其他代碼的執(zhí)行。還有像setTimeout方法同樣也是異步執(zhí)行回調(diào)的方法。 如果對異步編程...
摘要:異步編程在傳統(tǒng)編程實(shí)踐中,大多數(shù)操作都是同步發(fā)生的。中的異步編程異步是一種輸入輸出處理的形式,它允許在傳輸完成之前,其它處理能繼續(xù)進(jìn)行。 本文轉(zhuǎn)載自:眾成翻譯譯者:網(wǎng)絡(luò)埋伏紀(jì)事鏈接:http://www.zcfy.cc/article/1759原文:https://blog.risingstack.com/node-hero-async-programming-in-node-js/ ...
摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...
閱讀 2526·2021-09-26 10:18
閱讀 3399·2021-09-22 10:02
閱讀 3209·2019-08-30 15:44
閱讀 3336·2019-08-30 15:44
閱讀 1841·2019-08-29 15:25
閱讀 2587·2019-08-26 14:04
閱讀 2052·2019-08-26 12:15
閱讀 2449·2019-08-26 11:43