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