摘要:回調函數成功回調處理器失敗回調處理器用戶發送一個向百度服務器獲取數據的異步請求無阻塞高并發的的誕生更加嚴重的依賴異步操作才能完成無阻賽高并發的特性。
Promise Promise 是什么? 詞語本意:
發音:[?pr?m?s] 詞性:名詞, 翻譯:許諾,允諾。MDN解釋
Promise 對象用于一個異步操作。
一個Promise表示一個現在,將來或永不可能可用的值。
按照書寫方式來解釋可以將異步操作的書寫方式變成一種隊列化的書寫方式,并按照我們寫的那樣的預期來執行返回符合預期的結果。
為什么需要Promisejs為檢查表單而生,其首要目標是操作dom,界面凍結會造成非常不友好的用戶體驗,所以dom操作大多是異步的。
注意:同步操作的處理器未執行完成會使得界面無法響應用戶的其他操作,而異步操作則可以避免該問題。
常見的異步操作語法:
$("#start").on("click",startHandler); function startHandler(){} // 定義事件響應的處理器函數
用戶點擊start元素就會觸發一個異步事件去執行,再次觸發不必等待前一次事件執行完成,就可以再次觸發。
2. 回調函數$.ajax("http://baidu.com",{ success:function(res){ // 成功回調處理器 }, error:function(e){ // 失敗回調處理器 } });
用戶發送一個向百度服務器獲取數據的異步請求
3. 無阻塞高并發的node的誕生更加嚴重的依賴異步操作才能完成無阻賽高并發的特性。
然而異步回調這種方式并不是理想的,它卻有一些問題,
比如:
回調地獄這種難于維護的書寫方式。
更深層次的問題:
嵌套回調中的循環語句出錯后,無法正常的使用return和throw終止
無法正常檢索堆棧信息(每一個回調都會重新建立堆棧)
多個回調之間難以建立聯系
Promise詳解一個promise的基本使用案例:
new Promise( // 執行器 executor function ( resolve, reject ) { //一段耗時很長的異步操作 resolve(); //異步處理成功 reject(); // 異步處理失敗 //注意:resolve和reject這倆個回調函數被調用是互斥的 } ).then( function A(){ //成功,下一步 }, function B(){ //失敗,做善后處理 } );
promise是一個代理對象,它和原先要進行的操作并無關系。
它通過引入一個回調,避免更多的回調。
pending 初始狀態 fulfilled 操作成功 rejectd 操作失敗
promise一經創建,執行器便會立刻執行;
異步操作通過調用resolve改變promise狀態為fulfilled,通過調用reject改變promise狀態為rejected;
promise狀態發生改變就會觸發then里面的響應函數;
promise狀態一經改變,不會再變。
//范例1 console.log("here we go"); new Promise( resolve => { setTimeout( () => { resolve("hello"); }, 2000); }).then( value => { console.log( value + " world"); }); /* 控制臺日志 */ here we go // 2s以后 hello world
// 范例2 console.log("here we go"); new Promise(resolve => { setTimeout( () => { resolve("hello"); }, 2000); }).then(value => { console.log(value); return new Promise( resolve => { setTimeout(() => { resolve("world"); }, 2000); }); }).then(value => { console.log( value + " world"); }); /* 控制臺日志 */ here we go // 2s后 hello // 2s后 world world
// 假如一個Promise已經完成了,再.then()會怎樣?
console.log("start"); let promise = new Promise(resolve => { setTimeout(() => { console.log("the promise fulfilled"); resolve("hello, world"); }, 1000); }); setTimeout(() => { promise.then( value => { console.log(value); }); }, 3000); /* 控制臺 */ 17:37:29.015 start 17:37:30.016 the promise fulfilled 17:37:32.017 hello, world
// 假如在.then()的函數里面不返回新的Promise,會怎樣?
console.log("here we go"); new Promise(resolve => { setTimeout( () => { resolve("hello"); }, 2000); }).then( value => { console.log(value); console.log("everyone"); (function () { return new Promise(resolve => { setTimeout(() => { console.log("Mr.Laurence"); resolve("Merry Xmas"); }, 2000); }); }()); // return false; }).then( value => { console.log(value + " world"); return 0 }).then( value => { console.log(value + " world"); }).then( value => { console.log(value + " world"); }); /* 控制臺 */ 17:53:03.175 here we go 17:53:03.191 Promise?{} 17:53:05.181 hello 17:53:05.181 everyone 17:53:05.181 undefined world 17:53:05.182 0 world 17:53:05.182 undefined world 17:53:07.187 Mr.Laurence 從日志可以看出, 1. 執行器中必須回調resolve或者reject改變promise的狀態; 2. 當狀態改變后繼續調用then方法,但是promise中的狀態已經無法改變了; 3. 可以看到promise對象幫我們生成了一個隊列,這個隊列一直存在。
then() 接受倆個狀態響應函數參數,分別代表fulfilled和rejected
then() 返回一個新的Promise實例,所以它可以鏈式調用
狀態響應函數可以返回新的Promise,其他值,或者不返回值
如果返回新的Promise,那么下一級.then()會在新的promise狀態改變之后執行
如果返回其它任何值,則會立刻執行下一級.then()
then里面有then的情況
1). 因為.then()返回的還是Promise實例。
2). 會等里面的.then()執行完,在執行外面的。
3). 對我們來說,此時最好將其展開,會更好閱讀。
測試
問題:下面四種Promise的區別是什么?
前提:doSomething方法和doSomethingElse方法均返回一個promise實例。 // #1 doSomething().then(function() { return doSomethingElse(); }); // #2 doSomething().then(function(){ doSomethingElse(); }); // #3 doSomething().then(doSomethingElse()); // #4 doSomething().then(doSomethingElse);
// 解析: // #1 doSomething().then(function() { return doSomethingElse(); }); //符合預期的,可以繼續回調then方法獲取doSomethingElse的結果 // #2 doSomething().then(function(){ doSomethingElse(); }); //then中沒有返回promise,所以之后的then無法獲取到doSomethingElse的結果,并且與doSomethingElse幾乎同時執行 // #3 doSomething().then(doSomethingElse()); // then應該接收一個狀態處理函數,當前這種情況傳入了一個promise實例,無法獲取上層promise的結果,而該層then會被忽略,下一層會獲取到doSomething()的結果 // #4 doSomething().then(doSomethingElse); // then方法中吧doSomethingElse直接當成狀態處理函數也是可以達到預期的
catch和then一樣會返回一個promise實例。如果沒有拋出錯誤,該實例默認也會返回fulfilled狀態。
Promise 常用函數 promise.all
接收一個數組參數,返回一個新的promise實例,響應函數中的結果為數組中的每個promise的結果。
與map連用
使用forEach和reduce實現隊列
ES2017 的async/await
該學習筆記是學習慕課網中 Promise入門 記錄
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94295.html
摘要:只要滑動了就會觸發,并且有一個代表當時滑動到第幾個。可能有一點笨笨的。 前言 在炎熱的夏天里最美滋滋的事情是什么呢,我覺得當然是宅在家里,吹著空調,吃著零食看電視劇電影里的帥氣小哥哥、漂亮小姐姐了!在閑暇時光我會經常用愛奇藝小程序看視頻,加上現在已經學習了一段時間小程序了,啪,動手模仿一個愛奇藝視頻小程序的念頭就產生了。雖然現在還是個小白,但是希望在這趟愛奇藝小程序之旅上為各位乘客朋友...
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。異步編程入門的全稱是前端經典面試題從輸入到頁面加載發生了什么這是一篇開發的科普類文章,涉及到優化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結思考,循序漸進的理解 TypeScript。 網絡基礎知識之 HTTP 協議 詳細介紹 HTT...
閱讀 3392·2021-09-22 15:17
閱讀 2740·2021-09-02 15:15
閱讀 1750·2019-08-30 15:54
閱讀 2001·2019-08-30 14:02
閱讀 2529·2019-08-29 16:58
閱讀 2988·2019-08-29 16:08
閱讀 1330·2019-08-26 12:24
閱讀 1653·2019-08-26 10:41