簡體   English   中英

如何在不調用 function 的情況下將參數傳遞給 function?

[英]How to pass parameters to function without calling function?

我試圖找到一種方法來獲得需要參數的 function,而無需實際調用 function。

當前損壞的代碼示例:

const _validations = {
  userID: (req) => check('userID').isString().isUUID('4').run(req),
};

async function (req, res, next) {
  const allReqFields = { ...req.body, ...req.params, ...req.query };

  const fieldsFound = [];
  for (let key of Object.keys(allReqFields)) {
    if (_.has(_validations, key)) {
      fieldsFound.push(_validations[key](req));
    }
  }

  await Promise.all(fieldsFound);

  return next();
},
  function (req, res, next) {
    const errors = validationResult(req);

    if (errors.isEmpty()) {
//ALWAYS HITS HERE
      return next();
    }else{}
}

有效但我不想要的代碼示例:

const _validations = {
  userID: (req) => check('userID').isString().isUUID('4').run(req),
};

async function (req, res, next) {
  const allReqFields = { ...req.body, ...req.params, ...req.query };

  for (let key of Object.keys(allReqFields)) {
    if (_.has(_validations, key)) {
      await _validations[key](req);
    }
  }


  return next();
},
  function (req, res, next) {
    const errors = validationResult(req);

    if (errors.isEmpty()) {
//Correctly hits here
      return next();
    }else{
//Correctly hits here
    }
}

對於某些情況:

function (req) => check('userID').isString().isUUID('4').run(req),返回一個 promise。

_validations object 中將會有更多的鍵/值。

_validations 中的每個_validations都需要將req傳遞給它。

最終目標是在將 req 傳遞給它們的同時運行所有這些異步函數。

我現在遇到的問題是fieldsFound.push(_validations[key](req)); 正在推送 promise 而不是 function 供我稍后調用。 這意味着fieldsFound是一個未解決的承諾數組

有任何想法嗎? 謝謝!

const _validations = {
  userID: () => check('userID').isString().isUUID('4'),
};

然后你推送函數而不調用它們:

fieldsFound.push(_validations[key]);

然后最后只用req調用每一個並等待返回的承諾:

await Promise.all(fieldsFound.map(func => func().run(req));

您可以使用 function 柯里化。

柯里化是函數式編程中的一個過程,我們可以將具有多個 arguments 的 function 轉換為一系列嵌套函數。 它返回一個新的 function ,它需要下一個內聯參數。

將您的 function 轉換為類似的東西。

const _validations = {
  userID: (req) => () => check('userID').isString().isUUID('4').run(req),
};

因此,您可以稍后調用 function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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