new Promise(function (resolve, reject) { // 要做的事情... });
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
//面試 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); }); };
//非同步方法求職 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的方式求職 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,最後同樣返回資訊「求職已經結束「
/** * 主執行緒 */ (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'); })();