簡體   English   中英

節點:util.promisify() 沒有回調作為最終參數

[英]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)
}

你有四個選擇。

  1. 以不同的順序將 function 與 arguments 包裝起來:
util.promisify((userID, company, jwt, callback) => myFunction(userID, company, callback, jwt))
  1. 提供你自己的承諾者(假設你控制着代碼)
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)一起使用,它將拉取您的自定義實現。

  1. 將其重新定義為 nodeback 樣式(最后回調)
myFunction = function(userID, company, jwt, callback) {
    /* ... */
    return callback(null, results)
}
  1. 重新定義它以在調用時強制類型(確保對此進行單元測試)
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM