如何在不调用函数的情况下将参数传递给函数?

时间:2020-05-24 07:22:10

标签: javascript node.js asynchronous promise async-await

我正试图找到一种方法来获取需要参数的函数而无需实际调用该函数。

当前的损坏代码示例:

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
    }
}

在某些情况下:

函数(req) => check('userID').isString().isUUID('4').run(req),返回一个诺言。

_validations对象中将有更多键/值。

_validations内部的每个函数都需要将req传递给它。

最终目标是在将所有req传递给它们的同时运行所有这些异步函数。

我现在遇到的问题是fieldsFound.push(_validations[key](req));提出了诺言,而不是我以后调用的函数。这意味着fieldsFound是未解决的承诺的数组

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

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

然后在不调用函数的情况下推送函数:

fieldsFound.push(_validations[key]);

然后最后只用req呼叫每个人,等待返回的诺言:

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

答案 1 :(得分:0)

您可以使用函数currying。

固化是函数编程中的一个过程,我们可以在其中转换函数 具有多个参数的嵌套函数序列。它返回一个新函数 期待下一个内联参数。

将您的函数转换为类似的内容。

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

因此您可以稍后调用该函数。