js 綁定最後一個參數
js 的 bind 除了綁定 this 外, 還能綁定從第一個開始的任意個參數。 但其實用 arguments 和 apply 就能做到, 甚至可以綁定從後面數來的參數。 由此就能把最後一個參數是 callback 的非同步函數自動轉為 promise。
function callbackToPromise(callbackFunction) {
return function returnPromise() {
const argumentArray = Array.from(arguments)
return new Promise((resolve, reject) => {
argumentArray.push((error, result) => {
if (error) reject(error)
else resolve(result)
})
callbackFunction.apply(this, argumentArray)
})
}
}
fs.readFilePromise = callbackToPromise(fs.readFile.bind(fs))
要自動很關鍵是要能知道傳入了幾個參數, 所以要有 arguments 物件, 或用 es6 的 rest parameter 和 destruct 寫法。
function callbackToPromise(callbackFunction) {
return (...argv) => new Promise((resolve, reject) => {
callbackFunction(...argv, (error, result) => {
if (error) reject(error)
else resolve(result)
})
})
}
nodejs 的 fs.readFile
函數是 callback 風格,
用起來很不順手,用的時候都會自己包成 promise。
node v8.0.0 後, util.promisify
能把這類函數自動轉成 promise 形式。