2.7.Promise
Promise?
Promise建構函式與Promise.prototype物件的設計, 主要為了Promisify, 也就是要把原本異步或同步的程式碼或函式, 打包成為Promise物件來使用. 包裝後才能使用Promise的語法結構, 也就是異步函式執行流程的語法結構.
在Promise的標準中, then是"然後、接下來"的意思, 這樣設計的主要目的是要能作連鎖(chained)的語法結構,也就是稱之為合成(composition)的一種運算方式, 這也是我們之所以要做Promisify的原因.
Promise的架構
使用Promise建構函式時, 必須傳入一個function, 此function需帶有兩個參數: resolve, reject.
這邊可以理解為當沒有發生任何錯誤時將會執行的function就是resolve, 而有例外狀況發生時將會使用到reject. 此外也可以讓Promise物件throw new Error,這樣便可以在使用時catch住例外狀況.
(1) 定義一個會回傳Promise物件的function:
function asyncFunction(value) { return new Promise(function(resolve, reject){ if (value) { try { ... resolve(a); // 已實現,成功 } catch (e) { throw new Error(e); // error handling } } else { reject(reason); // 有錯誤,已拒絕,失敗 } }); }
(2)使用Promise物件:
asyncFunction(10).then(function(value) { // 已實現,成功 //do something }, function(reason) { // 有錯誤,已拒絕,失敗 //do something }).catch(function(err) { // error handling })
實作
由於在專案上碰到了一個情形, 於是便開始著手研究promise: client所需要繳交給server的參數相當多, 於是我就把所有的參數都塞進json中, 再讓server parse 最後將parse後的結果當成參數寫入/查詢資料庫, 此過程中需要在parse json物件後去讀寫資料庫, 是連續的動作, 必須用到像是promise一般的chaining處理流程, 但是Json.parse本身不會回傳promise物件
1.定義Promise物件:
function promiseParse(value) { return new Promise(function(resolve, reject) { if (value) { try { a = JSON.parse(value); resolve(a); // 已實現,成功 } catch (e) { throw new Error(e); } } else { reject(reason); // 有錯誤,已拒絕,失敗 } }); }
2.使用Promise物件:
var obj = req.body.tester; promiseParse(obj).then(function(value) { console.log(value.mail); console.log(value.name); }, function(reason) { res.write(reason); res.end(); }).catch(function(err) { res.write(err); res.end(); });
Last updated
Was this helpful?