摘要:對象設置初始狀態默認為等待狀態用數組來保存成功函數設置為成功狀態設置為失敗狀態調用回調函數增加方法根據狀態執行成功失敗方法執行成功方法執行失敗方法將成功失敗方法保存在數組里
promise理解
promise的意思是承諾。承諾理解為某個時候一些條件滿足后,會兌現一件事情。
//為了方便理解我編一個小故事 //先假裝我有一個女朋友 //她承諾如果她爸媽不回來就給我就可以去幫她修電腦 否則... let promise = new Promise(function (success,fail) { //她說三秒后會告訴我今晚爸媽回不回來 let herParentBack = Math.random() > 0.5 ? true : false; setTimeout(function(){ if(herParentBack){ success("我馬上過來來幫你修你電腦"); }else{ fail("你要早點休息"); } },3000); }); //第一個函數接收sucess函數傳來的成功信息 //第二個函數接收fail函數傳來的失敗信息 promise.then(function (sucessMsg) { console.log(sucessMsg); },function (fail) { console.log(failMsg); }) //我馬上過來幫你修電腦
new Promise會傳入一個回調函數,會伴著對象創建被立即調用。
這個function是承諾的主體內容。一般我們會做一些判斷或者異步請求。(在這里要等女友回消息,我想好怎么回答她。)
promise.then方法在promise執行了success或fail后會執行對應的成功失敗方法。 (這里理解為吧想好告訴她)
promise實現根據promis規范promise Promise/A
Promise設置了三個狀態,"pending"、"resolved"、"rejected"。
//Promise對象設置初始狀態 function Promise(callback) { var self = this; //默認為等待狀態 self.status = "pending"; self.value = undefined; self.reason = undefined; //用數組來保存成功函數 self.onResolvedCallBacks = []; self.onRejectedCallbacks = []; function resolve(value){ if(self.status === "pending"){ //設置為成功狀態 self.status = "resolved"; self.value = value; self.onResolvedCallBacks.forEach(item=>item(self.value)); } } function reject(reason) { if(self.status === "pending"){ //設置為失敗狀態 self.status = "rejected"; self.reason = reason; self.onRejectedCallbacks.forEach(item=>item(self.reason)); } } callback(resolve,reject); //調用Promise回調函數 } module.exports = Promise;
增加Promise.then方法
//根據Promise狀態執行成功失敗方法 Promise.prototype.then = function (onFulfilled,onRejected) { let self = this; onFulfilled = typeof onFulfilled == "function"?onFulfilled:function(value){return value}; onReject = typeof onReject=="function"?onReject:function(reason){throw reason;} if(self.status === "resolved"){ return new Promise(function (resolve,reject) { try { let x = onFullFilled(self.value); if(x instanceof Promise){ x.then(resolve,reject); }else{ resolve(x); } } catch(e) { reject(e); } }) //執行成功方法 }else if(self.status == "rejected"){ return new Promise(function (resolve,reject) { try { let x = onRejected(self.reason); if(x instanceof Promise){ x.then(resolve,reject); }else{ resolve(x); } } catch(e) { reject(e) } }) //執行失敗方法 } if(self.status === "pending"){ return new Promise(function (reslove,reject) { self.onResolvedCallBacks.push(function () { let x = onFullFilled(self.value); if(x instanceof Promise){ x.then(resolve,reject); }else{ resolve(x); } }) self.onRejectedCallbacks.push(function () { let x = onRejected(self.reason); if(x instanceof Promise){ x.then(resolve,reject); }else{ resolve(x); } }) }) //將成功失敗方法保存在數組里 } }
Promise.all
Promise.all = all; function all(iterable) { var self = this; if (!isArray(iterable)) { return this.reject(new TypeError("must be an array")); } var len = iterable.length; var called = false; if (!len) { return this.resolve([]); } var values = new Array(len); var resolved = 0; var i = -1; var promise = new this(INTERNAL); while (++i < len) { allResolver(iterable[i], i); } return promise; function allResolver(value, i) { self.resolve(value).then(resolveFromAll, function (error) { if (!called) { called = true; doReject(promise, error); } }); function resolveFromAll(outValue) { values[i] = outValue; if (++resolved === len && !called) { called = true; doResolve(promise, values); } } } }
Promise.race
Promise.race = function(iterable) { var self = this; if (!isArray(iterable)) { return this.reject(new TypeError("must be an array")); } var len = iterable.length; var called = false; if (!len) { return this.resolve([]); } var i = -1; var promise = new this(INTERNAL); while (++i < len) { resolver(iterable[i]); } return promise; function resolver(value) { self.resolve(value).then(function (response) { if (!called) { called = true; doResolve(promise, response); } }, function (error) { if (!called) { called = true; doReject(promise, error); } }); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92448.html
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。寫一個符合規范并可配合使用的寫一個符合規范并可配合使用的理解的工作原理采用回調函數來處理異步編程。 JavaScript怎么使用循環代替(異步)遞歸 問題描述 在開發過程中,遇到一個需求:在系統初始化時通過http獲取一個第三方服務器端的列表,第三方服務器提供了一個接口,可通過...
摘要:的翻譯文檔由的維護很多人說,阮老師已經有一本關于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:從源碼看概念與實現是異步編程中的重要概念,它較好地解決了異步任務中回調嵌套的問題。這些概念中有趣的地方在于,標識狀態的變量如都是形容詞,用于傳入數據的接口如與都是動詞,而用于傳入回調函數的接口如及則在語義上用于修飾動詞的副詞。 從源碼看 Promise 概念與實現 Promise 是 JS 異步編程中的重要概念,它較好地解決了異步任務中回調嵌套的問題。在沒有引入新的語言機制的前提下,這...
摘要:顯然,了解的實現細節,可以幫助我們更好地應用它。本文將主要根據的這篇文章,探討的實現細節。核心說明盡管已經有自己的規范,但目前的各類庫,在的實現細節上是有差異的,部分甚至在意義上完全不同。到前面到為止,所實現的都是不能級聯的。 在之前的異步JavaScript與Promise一文中,我介紹了Promise以及它在異步JavaScript中的使用意義。一般來說,我們是通過各種JavaSc...
摘要:對于引擎來說,兩者獲取堆棧的方式是不同的。對于引擎來說,堆棧信息附加在了函數所返回的并在鏈中傳遞,這樣函數也能在需要的時候獲取堆棧信息。使用可以實時監控線上應用的錯誤,并獲取完整的堆棧信息。 譯者按: Async/Await真的只是簡單的語法糖嗎?No! 原文:Asynchronous stack traces: why await beats .then() 作者: Math...
閱讀 3027·2023-04-25 18:00
閱讀 2234·2021-11-23 10:07
閱讀 4078·2021-11-22 09:34
閱讀 1256·2021-10-08 10:05
閱讀 1577·2019-08-30 15:55
閱讀 3447·2019-08-30 11:21
閱讀 3350·2019-08-29 13:01
閱讀 1387·2019-08-26 18:26