這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 介紹 可曾想過我們每次創建新項目,或者換地方寫程式,都要把之前寫過的工具類找出來又要複製粘貼一遍有些麻煩,尤其是寫uni-app自定義模板主要還是開發工具完成的。這時為什麼不自己做一款自己的uni-app工具箱,每次用直接從商城導入就行了 ...
![0](https://img2023.cnblogs.com/blog/217320/202212/217320-20221216220325189-1413198018.png)
JavaScript Promise
Promise 是一個 ECMAScript 6 提供的類,目的是更加優雅地書寫複雜的非同步任務。 如何創建一個 Promise 對象?new Promise(function (resolve, reject) { // 要做的事情... });Promise 的使用:
new Promise(function (resolve, reject) { console.log(1111); resolve(2222); }).then(function (value) { console.log(value); return 3333; }).then(function (value) { console.log(value); throw "An error"; }).catch(function (err) { console.log(err); });執行結果:
1111
2222
3333
An error
JavaScript async/await非同步方法
- async 是“非同步”的簡寫,async 用於申明一個 function 是非同步的,而 await 用於等待一個非同步方法執行完成,await 只能出現在 async 函數中。
- async 表示這是一個async函數, await只能用在async函數裡面,不能單獨使用
- async 返回的是一個Promise對象,await就是等待這個promise的返回結果後,再繼續執行
- await 等待的是一個Promise對象,後面必須跟一個Promise對象,但是不必寫then(),直接就可以得到返回值
//面試 function interview(round) { return new Promise((resole, reject) => { setTimeout(() => { var score = Math.random(); if (score > 0.6) { resole(score); } else { var err = new Error(`分數:${score}`); err.round = round; reject(err) } }, 1000); }); };該方法的參數round為第幾輪面試,方法返回一個promise,獲取一個隨機數,隨機數就是面試的得分,超過0.6即為通過面試,否則為不通過。
通過非同步方法來實現求職過程:
//非同步方法求職 async function seekJobs() { console.log('seekJobs => start'); console.time('seekJobs'); try { console.log('第 1 輪面試得分:', await interview(1)); console.log('第 2 輪面試得分:', await interview(2)); console.log('第 3 輪面試得分:', await interview(3)); console.log('yeah!'); } catch (error) { console.error('第 ' + error.round + ' 輪面試沒通過:', error); } console.log('seekJobs => end.'); console.timeEnd('seekJobs'); return '求職已經結束。'; };
通過async聲明該方法為非同步方法,每一輪面試用await等待返回面試結果,通過可進入下一輪面試,不通過則記錄是第幾輪面試和得分,最後方法返回信息“求職已經結束。”
通過Promise方式來實現求職過程:
//promise的方式求職 function seekJobs_P() { console.log('seekJobs => start'); console.time('seekJobs'); interview(1) .then((score) => { console.log('第 1 輪面試得分:', score); return interview(2); }) .then((score) => { console.log('第 2 輪面試得分:', score); return interview(3); }) .then((score) => { console.log('第 3 輪面試得分:', score); console.log('yeah!'); }) .catch((error) => { console.error('第 ' + error.round + ' 輪面試沒通過:', error); }); console.log('seekJobs => end.'); console.timeEnd('seekJobs'); return '求職已經結束。'; };
每一輪面試的通過都會進入到then,列印分數並調用下一輪面試,直到所有面試都通過,中間過程中有一輪面試沒通過則進入到catch,最後同樣返回信息“求職已經結束“
最後寫主程式main方法
/** * 主線程 */ (function main() { console.log('main.start======================================'); console.time('main'); //調用求職的非同步方法,遇到await不等待,直接返回到mian方法繼續執行,main執行完才輸出求職返回結果 // seekJobs().then((res) => { // console.log('求職返回:', res); // }); //調用promise的方式求職,遇到then繼續執行並返回"求職已經結束。",回到main方法輸出求職返回結果,最後再輸出每一次面試的分數 var res = seekJobs_P(); console.log('求職返回:', res); console.log('main.end======================================'); console.timeEnd('main'); })();
主程式這裡可以分別調用seekJobs和seekJobs_P兩種方式的求職。 1、非同步方法在遇到await就直接 返回到main方法,main方法繼續往下執行,非同步方法由另外的線程取執行,執行結束再回調。 2、promise方法則是在遇到then繼續執行並返回"求職已經結束。",回到main方法輸出求職返回結果,最後再輸出每一次面試的分數。