——基於es6:Promise/A+ 規格簡單實現非同步流程控制想法
前言:
nodejs強大的非同步處理能力使得它在伺服器端大放異彩,基於它的應用不斷的增加,但是異步隨之帶來的嵌套、難以理解的代碼讓nodejs看起來並沒有那麼優雅,顯得臃腫。類似於這樣的程式碼:
function println(name,callback){var value = {"ztf":"abc","abc":"def","def":1} setTimeout(function(){ callback(value[name]); },500); } println("ztf",function(name){ println(name,function(res){ console.log(res);//def println(res,function(res1){ console.log(res1);//1 }) }); });
上面的程式碼println中定義了value對象,延遲五百秒呼叫callback傳入相關的值,
先呼叫println傳入"ztf",假設下一個執行函數依賴與本次傳回的值,那麼呼叫就變成了上面的程式碼傳入ztf返回abc ,使用abc返回def,使用def返回1;
因為nodejs是作為服務端使用,必不可少的就是各種資料庫查詢,資料庫查詢擁有更多的依賴,例如我需要查詢某個使用者的權限,那麼需要三步驟
① 通過id尋找使用者
② 透過傳回的使用者角色id尋找對應的角色
③ 透過角色找到對應的權限
# 此處才需要三層嵌套關係,程式碼也需要三層嵌套關係,程式碼也需要三層嵌套關係,程式碼也需要三層嵌套關係,程式碼也需要三層巢狀關係,程式碼也需要三層巢狀關係,程式碼也需要三層巢狀關係,程式碼也需要三層巢狀關係,程式碼也會找到對應的權限
#就跟上面的差不多了。
promise/A+規格 Promise表示一個非同步運算的最終結果。它有三個狀態,分別是
未完成態、完成態(resolve)、失敗態(reject) 狀態不可逆,完成態不能回傳未完成,失敗態不能變成完成態
與promise主要的交互方式是在它的then方法中傳入回呼函數,形成鍊式調用,
# #實作
首先我們來看Promise/A+規範在具體的應用中的呼叫方式:
var printText = function(name){var deferred = new Deferred(); //new一个托管函数println(name,deferred.callback());//把回调函数托管到Deferred中实现return deferred.promise; //返回promise对象实现链式调用} printText("ztf") .then(function(name){ console.log(name);return printText(name); //第二次调用依赖第一次调用 返回promise对象 在成功态中判断 }) .then(function(res){ console.log(res);//defreturn printText(res); }) .then(function(res1){ console.log(res1);//1});
這樣的程式碼從某種程度上,改變了非同步程式碼不斷嵌套的現狀,透過then()方法的鍊式調用,達到非同步程式碼的流程控制。
//处理回调var Promise = function(){this.queue = []; //存储的是回调函数的队列this.isPromise = true; }//延迟对象var Deferred = function(){this.promise = new Promise(); } Deferred.prototype = {//托管了callback回调函数 callback:function(){ },//完成态 resolve:function(){ },//失败态 reject:function(){ } }
Promise =.queue = []; .isPromise = = handler =((fulfilledHandler) == =((errorHandler) == = Deferred =.promise = =
可以看到Promise.then方法只是將回呼插入佇列,一個完成態執行,一個失敗態執行。
//处理内部操作var Promise = function(){this.queue = []; //存储的是回调函数的队列this.isPromise = true; } Promise.prototype = {//then方法 fulfilledHandler是完成态时执行的回调函数 errorHandler则是失败态
then:function(fulfilledHandler,errorHandler){ var handler = {}; if(typeof(fulfilledHandler) == "function"){ handler.fulfilled = fulfilledHandler; } if(typeof(errorHandler) == "function"){ handler.errored = errorHandler; } this.queue.push(handler); return this; }
Deferred =.promise = = self = promise =((handler = promise.queue.shift())){ (handler && res = handler.fulfilled.apply(self,args); (res && res.isPromise){ res.queue ==
加入了完成型操作,這段程式碼取得了.then傳入的回呼函數集合 promise.queue while依序調用,傳入目前的arguments
然後我們需要將完成態在託管回呼函數(Deferred.callback())中,按照邏輯執行:
Promise =.queue = []; .isPromise = = handler =((fulfilledHandler) == =((errorHandler) == = Deferred =.promise = = self = args = Array.prototype.slice.call(arguments); = args.concat(Array.prototype.slice.call(arguments,)); self = promise = args =((handler = promise.queue.shift())){ (handler && res = handler.fulfilled.apply(self,args); (res && res.isPromise){ res.queue ==
//处理内部操作var Promise = function(){this.queue = []; //存储的是回调函数的队列this.isPromise = true;
}
Promise.prototype = {//then方法 fulfilledHandler是完成态时执行的回调函数 errorHandler则是失败态 then:function(fulfilledHandler,errorHandler){var handler = {};if(typeof(fulfilledHandler) == "function"){
handler.fulfilled = fulfilledHandler;
}if(typeof(errorHandler) == "function"){
handler.errored = errorHandler;
}this.queue.push(handler);return this;
}
}//处理外部操作var Deferred = function(){this.promise = new Promise();
}
Deferred.prototype = {//托管了callback回调函数 callback:function(){var self = this;var args = Array.prototype.slice.call(arguments); //将arguments转为数组return function(err){if(err){//这里是失败态 传入了error对象 self.reject.call(self,err);return;
}
args = args.concat(Array.prototype.slice.call(arguments,1)); //合并外部arguments 与内部arguments 去掉err//这里是完成态 console.log(args);
self.resolve.apply(self,args);
}
},//完成态 resolve:function(){var self = this;var promise = self.promise;var args = arguments;var handler; while((handler = promise.queue.shift())){ //取出待执行队列中的第一个函数 直到全部执行完毕if(handler && handler.fulfilled){var res = handler.fulfilled.apply(self,args); //调用失败态回调函数if(res && res.isPromise){ //如果有二次嵌套 则再次执行promiseres.queue = promise.queue;
self.promise = res;return;
}
}
}
},//失败态 reject:function(err){var self = this;var promise = self.promise;var args = arguments;var handler;while((handler = promise.queue.shift())){ //取出待执行队列中的第一个函数 直到全部执行完毕if(handler && handler.errored){ var res = handler.fulfilled.call(self,err); //调用完成态回调函数
}
}
}
}
總結
① 每個操作都回傳一樣的promise對象,保證鍊式操作
② 函數函數一個參數總是error物件無報錯則null
### ③ 每個鍊式都透過then方法連接回傳promise物件再次執行###以上是基於es6:非同步流程控制思想的詳細內容。更多資訊請關注PHP中文網其他相關文章!

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)