gpt4 book ai didi

Javascript/Node/Express : res. json需要等待一个函数运行完毕才返回...但是res.json不耐烦?

转载 作者:行者123 更新时间:2023-11-29 10:55:26 28 4
gpt4 key购买 nike

friend 们好!希望你一切都好。

所以在这段代码中,我有一个我要查询的十台服务器的列表。这十台服务器由我在常量“端口”顶部定义的十个端口表示。

想法是在“端口”上使用 forEach(),并在每个服务器上运行查询。每次运行查询都会返回一个对象,并将其添加到最初为空的数组“数据”中。

然后!在“数据”加载了包含我的服务器状态的十个对象之后,我希望它返回给客户端!

但是......这不是发生的事情。 Port.forEach() 运行查询很好,并添加到数组“数据”中......但在 res.json 跳枪并将空数据发送回我很快就会失望的客户之前。

到目前为止……我已经尝试过回调和异步/等待……但我还没有弄清楚它的语法……任何提示都会很棒!谢谢你的时间 friend 们!

module.exports = app => {
app.get("/api/seMapServerStatus", (req, res) => {

const ports = [ "27111", "27112", "27117", "27118", "27119", "27110", "27115", "27116", "27113", "27114" ]
const data = []

function hitServers(port){
Gamedig.query({
type: "aGameType",
host: "theServer'sIP",
port: port
}).then((state) => {
data.push(state)
console.log("this is the server", state)
}).catch((error) => {
console.log("Server is offline");
});
};

ports.forEach(port => {
hitServers(port)
})
});
console.log("and here is the final server list", data)
res.json(data);
}

最佳答案

上面的代码是同步执行的,因此在任何 promise 有机会 resolve 之前,您在同一帧中返回。

我们可以按如下方式清理上面的代码:

module.exports = app => {

app.get("/api/seMapServerStatus", (req, res) => {
const ports = ["27111", "27112", "27117", "27118", "27119", "27110", "27115", "27116", "27113", "27114"]

function hitServers(port) {
return Gamedig.query({
type: "aGameType",
host: "theServer'sIP",
port: port
})
}

// With error handling
function hitServersSafe(port) {
return hitServers(port)
.then(result => {
return {
success: true,
result: result
}
})
.catch(error => {
return {
success: false,
// you probably need to serialize error
error: error
}
})
}

const promises = ports.map(port => hitServers(port))
// With error handling
// const promises = ports.map(port => hitServersSafe(port))

Promise
.all(promises)
.then(data => res.json(data))
.catch(error => {
// do something with error
})
})

}

我们将每个端口映射到一个 promise 。在我们有了 X promise 列表之后,我们等待 all他们完成。

调用 Promise.all() 返回已解析值的数组,或在任何 promise 拒绝时拒绝。

只有在所有 promise 都已解决后,我们才能继续并将结果发送给客户端。

关于Javascript/Node/Express : res. json需要等待一个函数运行完毕才返回...但是res.json不耐烦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58509876/

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