Promise chain === javascript 的非同布 ```javascript= function asyncDemo() { taskA(); taskB(); taskC(); } function taskA (){ setTimeout(function(){ console.log('A'); }, 3000); } function taskB() { setTimeout(function(){ console.log('B'); }, 500); } function taskC() { setTimeout(() => { console.log('C'); }, 1500); } ``` 若執行 asyncDemo(); 輸出為 ? Ans: B C A --- ```javascript= const taskA = () => { return new Promise(function (resolve, reject) { setTimeout(function () { console.log('taskA'); resolve('Async Hello world: A'); }, 3000); }); } const taskB = () => { return new Promise(function (resolve, reject) { setTimeout(function () { console.log('taskB'); resolve('Async Hello world: B'); }, 1500); }); } const taskC = () => { return new Promise(function (resolve, reject) { setTimeout(function () { console.log('taskC'); resolve('Async Hello world: C'); }, 750); }); } ``` ### 執行主程式 方法一 : ```javascript= taskA().then(function(stringA){ console.log(stringA); return taskB(); }).then(function(stringB){ console.log(stringB); return taskC(); }).then(function(stringC){ console.log(stringC); }); ``` 執行結果 ![](https://i.imgur.com/MIbXyWj.png) 方法二 : ```javascript= taskA() .then(taskB) .then(taskC); ``` 執行結果 ![](https://i.imgur.com/DW4XJF0.png) 方法二帶參數: ```javascript= const getFirstUser = () => new Promise((rs, rj) => { getUserList('http://xxxx.com').then((userList) => { rs(data[0]); }).catch((err)=>{ rj(err) }) }); const getAvatar = (userData) => new Promise((rs, rj) => { getUserAvatar(userData).then((avatar) => { rs(avatar); }).catch((err) => { rj(err); }) }); getFirstUser() .then(getAvatar) .then((avatar) => {console.log('get avatar success', avatar)}) .catch((e)=>{ console.err(e)}); ``` #### 補充 http://stackoverflow.com/questions/36490803/javascript-promises-and-settimeout ![](https://i.imgur.com/33ny12A.png) [Promise chain book](http://azu.github.io/promises-book/#ch2-promise.then) ![](https://i.imgur.com/QcsOZAq.png) ![](https://i.imgur.com/VlFPZf8.png) --- 之前在coding時剛好翻了一下之前提過的promise book 我發現他當中有提到若想要在promise chain 內的then 做拋錯處理時 應該要怎麼用比較好 文章如下 -> http://azu.github.io/promises-book/#not-throw-use-reject **大意: 當要在 then 中拋錯時 return Promise.reject() 會比 throw Error 的方式還好** 寫個簡單的範例如下 ```javascript= const demoChain = params => new Promise((resolve, reject) => { const { a, b } = params; asyncFunA(a) .then((result) => { // if (!result) throw new Error('whatever'); if (_.isEmpty(result)) return Promise.reject('whatever'); return asyncFunB(b); }) .then((result) => { if (!result) return Promise.reject('whatever'); return Promise.resolve('hello world'); // origin : resolve('hello world'); but ESLint will error: [eslint] Expected to return a value at the end of arrow function. (consistent-return) }) .then((result) => { // get result from Promise.resolve console.log(result) // 'hello world' resolve(result); }) .catch((error) => { // will catch Promise.reject console.log(error); // 'whatever' reject(error); }); }); ```