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 形式。