gpt4 book ai didi

javascript - 如何在 javascript 中使用带有 eval() 函数的异步等待?

转载 作者:行者123 更新时间:2023-12-04 17:26:21 27 4
gpt4 key购买 nike

我正在使用 eval 函数来评估字符串,我正在对 eval 函数应用 await 以便我将获得所有值。但是等待不起作用

我的代码是这样的:-

if (matchCard.card.status != "notstarted") {
return new Promise((resolve) => {
questionSetObj.forEach(async ([key, value], index) => {
let thisVal = await eval(value.functionName)(value, key);
console.log("thisVal....", thisVal)
if (thisVal) {
if (thisVal[key] != "NotFound") answerSet[key] = thisVal[key]
}
console.log("answerSet", answerSet);
answerSetArray.push(answerSet);
if (index === questionSetObj.length - 1) resolve(answerSetArray);
});
})
}

上述函数中使用的变量,它们的值:-

变量值 = {teamTwoId: 'wi',matchId: 'iccrzt20_2020_vg_g7',question: '哪支球队会赢得比赛?',functionName: 'matchWinnerTeam',选项:{选项2:'西印度群岛',选项1:'阿富汗'},teamOneId: 'afg'

在值 obj 中,函数名称:'matchWinnerTeam'。 matchWinnerTeam() 是一个评估问题答案的函数。

变量键 = Q1

同样,我有5个类似这样的问题集。

问题陈述:-

我的 answerSet 对象值应该返回类似这样的值:-答案集 = {Q5:'选项2',Q3:'选项2',Q2:'选项2',Q4:'选项1',Q1:'选项2'}但实际上,每当我在 Node js 服务器上运行此函数时,它都会返回类似这样的值:-
{Q5:'选项2',Q3:'选项2',}, {Q1:'选项2',Q4:'选项2',} ......等等。

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

那么我可以像这样在 eval() 上使用 await 还是会有一些替代方法来执行此任务?

请帮助。谢谢你

最佳答案

好吧,我不认为使用 eval 是邪恶的,当然是在您知道自己在做什么的情况下!在您的情况下,据我了解,您想等待 eval 完成。因此,您可以创建 promise 包装器并将 resolve 放入您的 eval 代码中,即像这样:

let toeval = `
// Iteration number
let i = 100;

// Finish function
const finish = () => {
// Resolve
resolve('This is data from eval');
}

// Delay function
const delay = () => {
setTimeout(() => {
if(i) {
i--;
delay();
} else finish();
}, 10);
}

// Run delay
delay();
`;

// Wait for eval wrapper
const waitEval = (ev) => {
return new Promise((resolve, reject) => {
eval(ev);
});
};

// Main function
(async () => {
// Start message
console.log(`Starting and waiting for eval to complete...`);

// Run and wait for eval
const x = await waitEval(toeval);
console.log(`Result from eval: ${x}`);

// Continue
console.log(`Finished! Continue program...`);
})();

但请记住,如果您想以更安全的方式执行与上述相同的操作,请使用 new Function 而不是 eval:

let toeval = `
// Iteration number
let i = 100;

// Finish function
const finish = () => {
// Resolve
resolve('This is data from eval');
}

// Delay function
const delay = () => {
setTimeout(() => {
if(i) {
i--;
delay();
} else finish();
}, 10);
}

// Run delay
delay();
`;

// Wait for new Function wrapper
const waitFn = (ev) => {
return new Promise((resolve, reject) => {
new Function('resolve', ev)(resolve);
});
};

// Main function
(async () => {
// Start message
console.log(`Starting and waiting for eval to complete...`);

// Run and wait for eval
const x = await waitFn(toeval);
console.log(`Result from eval: ${x}`);

// Continue
console.log(`Finished!`);
})();

关于javascript - 如何在 javascript 中使用带有 eval() 函数的异步等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63030198/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com