javascript - 承诺:过早地解决返回值
问题描述
更新:我的问题的根源是,我通过他们的 uuid 为我的数组分配值。所以即测验[uuid] = x。因此,数组长度为 0,并且该属性显然未在 json 响应中处理。
我正在构建一个函数,在其中初始化对象测验并在 for 循环中更改它。完成后,我想兑现承诺。当我调用这个函数时,我只收到初始化值并且缺少来自 for 循环的更改。console.log(quiz) 记录对象的变化。我找不到我的错误...
我尝试了一些 if 子句,只在 for 循环完成时调用 resolve 函数。这导致相同的结果或没有响应。
app.get('/playQuiz', function (req, res) {
playQuiz().then(data => {
res.status(200).json({
quiz: data
});
});
});
async function playQuiz(){
var players = {
puuids: [],
stats: []
}
credentials = await getCredentials();
token = credentials.token;
port = credentials.port;
players.puuids = await getLobby(port, token);
for(i=0; i<players.puuids.length; i++){
players.stats[i] = await getStats(port, token, players.puuids[i])
}
let quiz = await evaluateQuiz(players)
console.log(quiz); // This displays the object quiz with the changes from the loop
return quiz; //The response i get displayed in Postman from this line, does not show the changes in i.e. csScore. It only shows an empty array.
}
function evaluateQuiz(players){
return new Promise((resolve, reject) => {
var quiz = [{
questionId: 1,
question: "Who has the most cs per game?",
csScore: []
},
{
questionId: 2,
question: "Who has the highest vision score per game?",
vsScore: []
},
{
questionId: 3,
question: "Who has the best win rate?",
winRate: []
},
{
questionId: 4,
question: "Who has the most quadra kills?",
quadraKills: []
},
{
questionId: 5,
question: "Who has the highest objective participation?",
objectiveRate: []
}
]
for(var i=0; i<players.puuids.length; i++){
quiz[0].csScore[players.puuids[i]] = players.stats[i].csScore / players.stats[i].gamePlayed;
quiz[1].vsScore[players.puuids[i]] = players.stats[i].visionScore / players.stats[i].gamePlayed;
quiz[2].winRate[players.puuids[i]] = players.stats[i].victory / players.stats[i].gamePlayed;
quiz[3].quadraKills[players.puuids[i]] = players.stats[i].quadraKills / players.stats[i].gamePlayed;
quiz[4].objectiveRate[players.puuids[i]] = players.stats[i].objectiveTakenInvolved / players.stats[i].gamePlayed;
}
//console.log(quiz);
resolve(quiz);
})
};
解决方案
在这种情况下执行异步过程时会使用 Promise 和回调,因为您所做的是不需要使用 Promise 的简单计算。
这将是您代码的解决方案,欢迎使用 StackOverflow 并快乐编码!
function evaluateQuiz(players) {
const quiz = [{ ...}]
for (var i = 0; i < players.puuids.length; i++) {
// Doing some object changes in this loop like:
quiz[0].csScore[players.puuids[i]] = players.stats[i].csScore / players.stats[i].gamePlayed;
}
return quiz;
};
阅读文章让你更好地理解Promises的使用
推荐阅读
- shacl - 结合 sh:in 和 sh:pattern 在定义中查找占位符
- sql - 即使查询失败,SSRS 订阅也会发送
- python - y 应该是一维数组,得到一个 shape () 数组
- tableau-desktop - 如何在 Tableau Desktop 中显示带有值的指标?
- ios - 应用在 iOS 12 上运行时无法对字符串值进行编码
- java - 由于 mojo 编译器导致 Maven 编译失败
- junit - 中所有测试的测试选择器包括一些额外的(JUnit5+Surefire)
- terraform - 如何通过 terraform 将流量从入口控制器路由到虚拟机布局在 gke 中的 Kubernetes 中的集群
- r - 如何解释> 2组中R中`prop.test`的估计比例输出?
- python - 从 csv 文件中获取 numpy 数组字符串并将其转换为 numpy 数组