摘要:基本用法是一種異步編程的解決方案的回調結果立馬輸出,秒之后輸出如果過程變得復雜,,用回調來處理會使代碼變得復雜代碼復雜影響后期維護,很難一眼看出回調之間的順序問題,代碼難以閱讀的返回一個對象實例,這個實例具有方法,就是執行下一步的功能表示執
Promise基本用法
Promise是一種異步編程的解決方案
1.es5的回調
{ let ajax = function (callback) { console.log("run1"); setTimeout(function () { callback && callback.call(); }, 1000); }; ajax(function () { console.log("timeout1"); }); // 結果:立馬輸出 run1,1秒之后輸出 timeout1 // 1.如果過程變得復雜,a()=>b()=>c()=>d()... ,用回調來處理會使代碼變得復雜 // 2.代碼復雜影響后期維護,很難一眼看出回調之間的順序問題,代碼難以閱讀 }
2.es6的Promise
{ let ajax = function () { console.log("run2"); // 返回一個對象(Promise實例),這個實例具有then()方法,就是執行下一步的功能 return new Promise(function (resolve, reject) { // resolve表示執行下一步操作 reject表示中斷當前操作 setTimeout(function () { resolve(); }, 1000); }); }; ajax().then(function () { // 這個方法對應resolve console.log("timeout2"); }, function () { // 這個方法對應reject }); // 結果:立馬輸出 run2,1秒之后輸出 timeout2 // 結果和es5一樣,但是代碼可讀性、可維護性更高 }
3.then()的串聯操作
{ let ajax = function () { console.log("run3"); return new Promise(function (resolve, reject) { setTimeout(function () { resolve(); }, 2000); }); }; ajax().then(function () { // 返回Promise實例,通過不斷的下一步下一步,實現了串聯操作的結果 return new Promise(function (resolve, reject) { setTimeout(function () { resolve(); }, 3000); }); }).then(function () { console.log("timeout3"); }); // 結果:立馬輸出 run3,5秒之后輸出 timeout3 }
4.catch方法
{ let ajax = function (num) { console.log("run4"); return new Promise(function (resolve, reject) { if (num >= 5) { resolve(); } else { throw Error(`出錯了,${num}小于5`); } }); }; // catch方法用來捕獲異常 ajax(6).then(function () { console.log(6); }).catch(function (err) { console.log(err); }); // 結果:輸出 run4 6 ajax(3).then(function () { console.log(3); }).catch(function (err) { console.log(err); }); // 結果:輸出 run4 Error: 出錯了,3小于5 }Promise.all()
例子:所有圖片加載完再統一添加到頁面
{ function loadImg(src) { return new Promise((resolve, reject) => { let img = document.createElement("img"); img.src = src; // onload監聽圖片加載完成 img.onload = function () { resolve(img); }; // onerror監聽圖片加載失敗 img.onerror = function (err) { reject(err); }; }); } function showImgs(imgs) { console.log(imgs); // [img, img, img] 三個img對象 imgs.forEach(function (img) { document.body.appendChild(img); }); } // Promise.all 把多個Promise實例當做一個Promise實例 // Promise.all(array).then(fn),array對應多個Promise實例,當所有實例狀態發生改變時,新的Promise實例才會跟著發生變化 // Promise.all也是返回Promise實例,所以也有.then()方法 // 當三張圖片都加載完成,才會執行showImgs,如果其中有圖片正在加載,不會執行showImgs,頁面上看不到任何一張圖片 Promise.all([ loadImg("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2530513100.webp"), loadImg("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2529571873.webp"), loadImg("https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2395733377.webp") ]).then(showImgs); }Promise.race()
例子:有一個圖片加載完就添加到頁面,其余的不管,只顯示最先加載完成的一張圖片
{ function loadImg(src) { return new Promise((resolve, reject) => { let img = document.createElement("img"); img.src = src; // onload監聽圖片加載完成 img.onload = function () { resolve(img); }; // onerror監聽圖片加載失敗 img.onerror = function (err) { reject(err); }; }); } function showImgs(img) { let p = document.createElement("p"); p.appendChild(img); document.body.appendChild(p); } // 當某一張圖片率先加載完成,執行showImgs顯示這張圖片,剩余圖片不再響應 Promise.race([ loadImg("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2530513100.webp"), loadImg("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2529571873.webp"), loadImg("https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2395733377.webp") ]).then(showImgs); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98763.html
摘要:優點按需加載可以寫中路徑也可以動態加以后默認就是嚴格模式,默認嚴格模式完參考視頻資料經典入門到進階 上一篇:ES6入門到進階(一):let、解構賦值、字符串模板、函數 一、循環 ES5里面新增一些東西 1.1 arr.forEach()(常用) 1. for for(let i=0; i [{t:aaaa}] let arr = [ ...
摘要:從入門到放棄是什么,黑歷史,不講,自己百度去。類你沒有看錯,這里面的就沒有問題的。之前我們用過,和有了,再也不用這兩個貨了。一個函數,可以遍歷狀態感覺就是狀態機,好吧不說了再說就懵逼了。 ES6從入門到放棄 1.ES6是什么,黑歷史,不講,自己百度去。 2.在瀏覽器中如何使用? 1.babel babeljs.io在線編譯 2.traceur-----Google出的編譯器,把E...
摘要:并總結經典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關注微信小程序的開發和面試問題,由基礎到困難循序漸進,適合面試和開發小程序。并總結vue React html css js 經典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
摘要:并總結經典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關注微信小程序的開發和面試問題,由基礎到困難循序漸進,適合面試和開發小程序。并總結vue React html css js 經典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
閱讀 3318·2019-08-29 16:17
閱讀 1975·2019-08-29 15:31
閱讀 2645·2019-08-29 14:09
閱讀 2548·2019-08-26 13:52
閱讀 744·2019-08-26 12:21
閱讀 2125·2019-08-26 12:08
閱讀 991·2019-08-23 17:08
閱讀 1922·2019-08-23 16:59