# 第三章 Node JS 非同步程式的處理方式 ## 同步的程式 ```htmlembedded= <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>同步流程控制</title> <script> // 同步的程式 function add(n1, n2){ return n1+n2; } function test(){ let result=add(20, 5); console.log(result); } </script> </head> <body> <h3>同步流程控制</h3> <button onclick="test();">Test</button> </body> </html> ``` ## 問題的起源: 非同步的程式 ```javascript= function delayedAdd(n1, n2, delayTime){ // 設定排程,延遲一段時間後執行 setTimeout(function(){ return n1+n2; }, delayTime); } function test(){ let result=delayedAdd(20, 5, 2000); console.log(result); } ``` ## 方法一: callback ```javascript= function delayedAdd(n1, n2, delayTime, callback){ // 設定排程,延遲一段時間後執行 window.setTimeout(function(){ // 延遲一段時間之後,計算加法,呼叫 callback 函式 callback(n1+n2); }, delayTime); } function test(){ delayedAdd(20, 5, 2000, function(result){ console.log(result); }); } ``` ## 方法二: promise ```javascript= function delayedAdd(n1, n2, delayTime){ // 建立 Promise 物件:new Promise(執行函式) let p = new Promise(function(resolve, reject){ window.setTimeout(function(){ resolve(n1+n2); // 工作完成,呼叫 resolve 函式,並且把結果透過參數傳遞回去 }, delayTime); }); return p; } function test(){ let promise=delayedAdd(20, 5, 2000); promise.then(function(result){ console.log(result); }).catch(function(error){ console.log(error); }); } ``` ## 方法三: async/await ```javascript= function delayedAdd(n1, n2, delayTime){ // 建立 Promise 物件:new Promise(執行函式) return new Promise(function(resolve, reject){ window.setTimeout(function(){ resolve(n1+n2); // 工作完成,呼叫 resolve 函式,並且把結果透過參數傳遞進去 }, delayTime); }); } async function test(){ let result=await delayedAdd(20, 5, 2000); console.log(result); } ```