[英]Node: util.promisify() without callback as final parameter
我正在嘗試使用util.promisify()
來轉換使用回調的 function 以便我可以使用 async/await 調用它: https://nodejs.org/dist/latest-v8.x/docs/api/util .html#util_util_promisify_original
到目前為止,我已經能夠將它與將回調作為最終參數的函數一起使用,正如它所期望的那樣。 但是當另一個項目是最終參數時,我對如何使用它感到困惑。
我有一個結構如下的 function:
myFunction = function(userID, company, callback, jwt) {
....
return callback(null, results)
}
由於jwt
是最終參數,我如何在此使用 promisify 並仍然通過jwt
? 我寧願不更改原始 function 的結構,因為其他地方都按原樣調用它
您可以在 function 周圍創建一個新的 function 包裝器,該包裝器僅接受 arguments 以不同的順序,以便最后移動回調:
const wrapper = (userID, company, jwt, callback) =>
myFunction(userID, company, callback, jwt);
const promisified = utils.promisify(wrapper);
對於更通用的解決方案,您可以使用 Lodash 的rearg
,它將根據您給它的數組更改 arguments 的順序:
const wrapper = _.rearg(myFunction, [0, 1, 3, 2]);
const promisified = utils.promisify(wrapper);
使用 function:
myFunction = function(userID, company, callback, jwt) {
/* ... */
return callback(null, results)
}
你有四個選擇。
util.promisify((userID, company, jwt, callback) => myFunction(userID, company, callback, jwt))
myFunction[util.promisify.custom] = function (userID, company, jwt) {
return new Promise((resolve, reject) => {
const callback = (err, result) => err ? reject(err) : resolve(result);
myFunction.call(this, userID, company, callback, jwt);
});
}
然后,您可以將其與utils.promisify(myFunction)
一起使用,它將拉取您的自定義實現。
myFunction = function(userID, company, jwt, callback) {
/* ... */
return callback(null, results)
}
myFunction = function(userID, company, callbackOrJwt, jwtOrCallback) {
const [callback, jwt] = callbackOrJwt !== null && typeof callbackOrJwt === 'object'
? [jwtOrCallback, callbackOrJwt] // possibly called with jwt first
: [callbackOrJwt, jwtOrCallback]; // possibly called with callback first
/* ... */
return callback(null, results)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.