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