如何在javascript中使用async wait with eval()函数?

如何在javascript中使用async wait with eval()函数?,javascript,node.js,Javascript,Node.js,我正在使用eval函数来计算字符串,并在eval函数上应用wait,以便获得所有值。但等待并不奏效 我的代码是这样的:- if(matchCard.card.status!=“notstarted”){ 返回新承诺((解决)=>{ questionSetObj.forEach(异步([键,值],索引)=>{ 让thisVal=wait eval(value.functionName)(value,key); console.log(“thisVal….”,thisVal) 如果(thisVal)

我正在使用eval函数来计算字符串,并在eval函数上应用wait,以便获得所有值。但等待并不奏效

我的代码是这样的:-

if(matchCard.card.status!=“notstarted”){
返回新承诺((解决)=>{
questionSetObj.forEach(异步([键,值],索引)=>{
让thisVal=wait eval(value.functionName)(value,key);
console.log(“thisVal….”,thisVal)
如果(thisVal){
如果(thisVal[key]!=“NotFound”)应答设置[key]=thisVal[key]
}
console.log(“应答集”,应答集);
answerSetArray.push(answerSet);
if(index==questionSetObj.length-1)解析(answerSetArray);
});
})
}
上述函数中使用的变量及其值:-

var值={ teamTwoId:'wi', matchId:'ICCRZT2020\U vg\U g7', 问题:“哪一队将赢得这场比赛?”, functionName:'matchWinnerTeam', 选项:{选项2:'西印度群岛',选项1:'阿富汗'}, teamOneId:“afg” }

在值obj中,functionName:'matchWinnerTeam'。matchWinnerTeam()是一个用于计算问题答案的函数

var键=Q1

类似地,我有5个问题集,类似于这样

问题陈述:-

我的answerSet对象值应返回如下值:- 回答集={ 问题5:‘选择2’, Q3:“选项2”, 问题2:“选择2”, Q4:“选项1”, Q1:“选项2” } 但实际上,每当我在我的节点js服务器上运行此函数时,它都会返回类似这样的值:-
{ 问题5:‘选择2’, Q3:“选项2”, }, { Q1:‘选项2’, Q4:‘选择2’, } ..... 等等

我发现的问题是eval函数必须等待,直到它返回从Q1到Q5的所有值,但wait在eval()上不起作用。它评估两个问题的答案并返回这两个值,而不是等待其余3个答案得到评估

那么我可以像这样使用wait on eval()吗,或者有其他方法来执行此任务


请帮忙。谢谢

好吧,我不认为使用eval是邪恶的,当然你知道你在做什么!在您的情况下,据我所知,您希望等待eval完成。因此,您可以创建promise包装器并将resolve放入您的评估代码中,例如:

让toeval=`
//迭代次数
设i=100;
//完成函数
常量完成=()=>{
//决心
解析(“这是来自eval的数据”);
}
//延迟函数
常数延迟=()=>{
设置超时(()=>{
如果(i){
我--;
延迟();
}else finish();
}, 10);
}
//运行延迟
延迟();
`;
//等待评估包装器
常量waitEval=(ev)=>{
返回新承诺((解决、拒绝)=>{
eval(ev);
});
};
//主要功能
(异步()=>{
//开始消息
log(`Starting and waiting for eval to complete…`);
//运行并等待评估
const x=等待等待等待(toeval);
log(`Result from eval:${x}`);
//继续
log(`Finished!Continue program…`);

})();请避免使用
eval
。您只使用它来按名称获取函数-您可以通过传递一个对象来按名称获取函数,或者更好,
questionSetObj
可以直接使用函数,因此您不需要
eval
它们,而是执行它们。您只能等待一个承诺,eval可以返回一个承诺,这取决于你在评估什么。这能回答你的问题吗@VLAZ基本上你是说我可以像这样直接使用(value.functionName)(value,key);不需要eval。@AmanSingh仅当您直接将函数作为引用传递时,而不是当您传递函数名时。所以你需要
[{f:function(){console.log(“one”);},{f:function(){console.log(“two”)}]
而不是
[{functionName:“functionOne”},{fffunctionname:“functionTwp”}