摘要:原生提供了對象,大大簡化了的代碼維護難度。實際實現(xiàn)遠離并不復(fù)雜,僅需要十幾行代碼,就能實現(xiàn)類似的效果實際還是有點區(qū)別的。簡單的實現(xiàn)的函數(shù)原文地址執(zhí)行如果執(zhí)行函數(shù)會同步返回結(jié)果,則調(diào)用。
ES6 原生提供了 Promise 對象,大大簡化了 callback 的代碼維護難度。使用promise對象之后可以使用一種鏈?zhǔn)秸{(diào)用的方式來組織代碼;讓代碼更加的直觀。
如果想在老瀏覽器中使用 Promise,需要使用第三方庫。實際實現(xiàn)遠離并不復(fù)雜,僅需要十幾行代碼,就能實現(xiàn)類似的效果(實際還是有點區(qū)別的)。
// 簡單的實現(xiàn) Promise 的函數(shù) // 原文地址:http://www.miaoqiyuan.cn/p/promise var PromiseDemo = function(fun, _status_code){ this._status_code = _status_code || "status"; //執(zhí)行 this.run = function(){ this._result = fun.call(this, fun); //如果執(zhí)行函數(shù)會 同步 返回結(jié)果,則調(diào)用callback。 if( !! this._result ){ return this.callback(); }; }; //回調(diào)函數(shù),如果不是立即返回結(jié)果,需要手動調(diào)用 this.callback = function(_result){ //異部調(diào)用時,傳入執(zhí)行結(jié)果 if( !!_result ){ this._result = _result; } //如過狀態(tài)不是 object this._result = this._result || {}; //如果沒有指定 【返回狀態(tài)】 值,如果沒有,則使用 status this._status = this._result[this._status_code] || "fail"; /* 如果 【返回狀態(tài)】 已經(jīng)定義了 回調(diào)函數(shù),調(diào)用本狀態(tài)回調(diào)函數(shù) 如果 【返回狀態(tài)】 沒有定義,則調(diào)用 _default 函數(shù) 如果 【返回狀態(tài)】 沒有定義,并且沒有調(diào)用 _default 函數(shù),拋出異常 */ this._callback = this[this._status] || this._default || function(){ throw new Error("Undefined " + this._status); }; return this._callback.call(this); }; //then判斷 this.then = function(_status, callback){ if( typeof _status == "function" ){ //沒有指定狀態(tài) callback = _status; if( !("success" in this) ){ //沒有 success,則將 callback 設(shè)置為 success 狀態(tài)的回調(diào)函數(shù) _status = "success"; }else if( !("fail" in this) ){ //沒有 fail,則將 callback 設(shè)置為 fail 狀態(tài)的回調(diào)函數(shù) _status = "fail"; }else{ // 如果 success 和 fail 已經(jīng)設(shè)置,無論調(diào)用多少次,都是 默認狀態(tài) 的回調(diào)函數(shù) _status = "_default"; }; }; //設(shè)置 【返回狀態(tài)】 的回調(diào)函數(shù) this[_status] = callback; //鏈?zhǔn)讲僮? return this; }; //鏈?zhǔn)讲僮? return this; }
就這么幾行代碼,就實現(xiàn)了簡單的 Promise。為了方便測試,寫成函數(shù)
var PromiseTest = function(fun, _status_code, _default){ if( typeof _status_code == "function" ){ _default = _status_code; _status_code = undefined; } var pTest = new PromiseDemo(fun, _status_code); pTest.then(function(){ console.log("Success!"); console.log(this._result); }); pTest.then(function(){ console.log("Fail!"); console.log(this._result); }); if( typeof _default == "function"){ pTest.then(_default); }; return pTest; }
下面的代碼用于測試效果: 返回成功狀態(tài)
PromiseTest(function(){ return { status: "success"}; }).run(); /* Success! Object {status: "success"} */
返回失敗狀態(tài)
PromiseTest(function(){ return { status: "fail"}; }).run(); /* Fail! Object {status: "fail"} */
返回其他狀態(tài),沒有定義,拋出異常
PromiseTest(function(){ return { status: "other"}; }).run(); /* Uncaught Error: Undefined other(…) */
修改 【返回狀態(tài)】 參數(shù),返回成功狀態(tài)
PromiseTest(function(){ return { status: "other", code : "success"}; }, "code").run(); /* Success! Object {status: "other", code: "success"} */
增加默認值函數(shù),所有未定義的狀態(tài),都是用此回調(diào)函數(shù)
PromiseTest(function(){ return { status: "other"}; }, function(){ console.log("Other"); }).run(); /* Other */
自定義狀態(tài)值,返回 nicai 狀態(tài)
PromiseTest(function(){ return { status: "nicai"}; }).then("wocai", function(){ console.log("Wocai"); }).then("nicai", function(){ console.log("Nicai"); }).run(); /* Nicai */
同步調(diào)用有返回值
PromiseTest(function(){ return { status: "nicai", value : "abc"}; }).then("nicai", function(){ console.log("Nicai"); return this._result.value; }).run() == "abc"; /* Nicai true */
異部調(diào)用測試:setTimeout
PromiseTest(function(){ setTimeout( (function(){ this.callback({ status : "success" }); }).bind(this), //必須bind,否則函數(shù)內(nèi)部的 this == window 1000); }).run(); /* Success! Object {status: "success"} */
異部調(diào)用測試:Ajax
PromiseTest(function(){ $.ajax({ type : "POST", url : "/services/PinYin", data : {input:"測試"}, success : (function(result){ this.callback({ status : "success", result : result }); }).bind(this), //通過 bind 改變 this 的指向 error : (function(){ this.callback(); }).bind(this) }); }).run(); //成功 /* Success! Object {status: "success", result: "Ceshi"} */ //失敗 /* Fail! Object {} */
異部調(diào)用測試:如果需要用 this 訪問 jQuery 的 ajax 對象
PromiseTest(function(){ var me = this; //在本函數(shù)內(nèi),用可以 me 指向 this(PromiseDemo的實例); $.ajax({ type : "POST", url : "/services/PinYin", data : {input:"測試"}, success : (function(result){ me.callback({ status : "success", result : result }); }), error : (function(){ me.callback(); }) }); }).run();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/91013.html
摘要:近幾年隨著開發(fā)模式的逐漸成熟,規(guī)范順勢而生,其中就包括提出了規(guī)范,完全改變了異步編程的寫法,讓異步編程變得十分的易于理解。最后,是如此的優(yōu)雅但也只是解決了回調(diào)的深層嵌套的問題,真正簡化異步編程的還是,在端,建議考慮。 本篇,簡單實現(xiàn)一個promise,主要普及promise的用法。 一直以來,JavaScript處理異步都是以callback的方式,在前端開發(fā)領(lǐng)域callback機制...
摘要:實現(xiàn)的一個簡單的如果有錯誤的地方,希望大家能夠不吝賜教僅實現(xiàn)及方法最下方有完整代碼開始一個對象接收的是一個這個接收兩個參數(shù)當(dāng)我們在內(nèi)執(zhí)行或的時候,就會調(diào)用內(nèi)定義的和函數(shù)然后,和函數(shù)會改變的狀態(tài)所以它應(yīng)該是像下面這樣的保存值記錄狀態(tài)為,為,為 實現(xiàn)的一個簡單的ES6 Promise(如果有錯誤的地方,希望大家能夠不吝賜教) 僅實現(xiàn)Promise及.then方法最下方有完整代碼 開始 一個...
摘要:在和方法執(zhí)行的時候訂閱事件,將自己的回調(diào)函數(shù)綁定到事件上,屬性是發(fā)布者,一旦它的值發(fā)生改變就發(fā)布事件,執(zhí)行回調(diào)函數(shù)。實現(xiàn)和方法的回調(diào)函數(shù)都是,當(dāng)滿足條件對象狀態(tài)改變時,這些回調(diào)會被放入隊列。所以我需要在某個變?yōu)闀r,刪除它們綁定的回調(diào)函數(shù)。 前言 按照文檔說明簡單地實現(xiàn) ES6 Promise的各個方法并不難,但是Promise的一些特殊需求實現(xiàn)起來并不簡單,我首先提出一些不好實現(xiàn)或者容...
摘要:簡單實現(xiàn)前言你可能知道,的任務(wù)執(zhí)行的模式有兩種同步和異步。你已經(jīng)實現(xiàn)了方法方法是一個很好用的方法。感興趣的朋友可以自行去研究哈附上代碼完整的實現(xiàn)個人博客鏈接 Promise 簡單實現(xiàn) 前言 你可能知道,javascript 的任務(wù)執(zhí)行的模式有兩種:同步和異步。 異步模式非常重要,在瀏覽器端,耗時很長的操作(例如 ajax 請求)都應(yīng)該異步執(zhí)行,避免瀏覽器失去響應(yīng)。 在異步模式編程中,我...
摘要:為了降低異步編程的復(fù)雜性,所以。難理解請參考的誤區(qū)以及實踐異步編程的模式異步編程的種方法 異步編程 javascript異步編程, web2.0時代比較熱門的編程方式,我們平時碼的時候也或多或少用到,最典型的就是異步ajax,發(fā)送異步請求,綁定回調(diào)函數(shù),請求響應(yīng)之后調(diào)用指定的回調(diào)函數(shù),沒有阻塞其他代碼的執(zhí)行。還有像setTimeout方法同樣也是異步執(zhí)行回調(diào)的方法。 如果對異步編程...
摘要:近幾年隨著開發(fā)模式的逐漸成熟,規(guī)范順勢而生,其中就包括提出了規(guī)范,完全改變了異步編程的寫法,讓異步編程變得十分的易于理解。最后,是如此的優(yōu)雅但也只是解決了回調(diào)的深層嵌套的問題,真正簡化異步編程的還是,在端,建議考慮。 前段時間頻頻看到Promise這個詞,今天發(fā)現(xiàn)騰訊AlloyTeam寫得這篇很贊,遂轉(zhuǎn)之。 原文鏈接 本篇,主要普及promise的用法。 一直以來,JavaScrip...
閱讀 1285·2023-04-25 19:10
閱讀 1159·2021-09-10 10:50
閱讀 3042·2021-09-02 15:21
閱讀 1401·2019-08-30 15:52
閱讀 1697·2019-08-30 13:56
閱讀 2099·2019-08-30 12:53
閱讀 1886·2019-08-28 18:22
閱讀 2136·2019-08-26 13:47