如何在javascript中使用async wait with eval()函数?
我正在使用eval函数来计算字符串,并在eval函数上应用wait,以便获得所有值。但等待并不奏效 我的代码是这样的:-如何在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)
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”}
。