![](/img/trans.png)
[英]How to pass parameters when calling a function without the parenthesis [Javascript]
[英]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.