我再次遇到这个异步编码问题,太烦人了。我想避免使用回调地狱,并避免使用new Promise
和解析开始,所以我使用async/await
了。
目标
我希望我的 Discord 机器人按照定义的顺序在频道中一个接一个地吐出每个服务器的状态。
问题
当然,输出的顺序是错误的。我知道每个服务器响应速度是不同的。尽管使用async/await
它仍然不能按我想要的方式工作,这让我感到困惑。看来我用错了,只是不知道在哪里。我尝试用循环迭代数组forEach
并使用它Promise.all()
,但它仍然不是正确的顺序。
我的代码 (MCVE)
我正在使用模块net来请求服务器状态,对于这个 MCVE,我使用了 3 个随机主机。
const
status = require('net'),
hosts = [
['Server #1', 'google.com', 80],
['Server #2', 'jhfg87ed4.com', 80], // fake, just for response check
['Server #3', 'stackoverflow.com', 80]
]
const server = async (id, cb)=> {
let host = hosts[id]
const sock = new status.Socket()
sock.setTimeout(2500)
sock.on('connect', ()=> {
cb(host[0]+': Up.')
sock.destroy()
}).on('error', e=> {
cb(host[0]+': Down: '+e.message)
}).on('timeout', e=> {
cb(host[0]+' Down: timeout')
}).connect(host[2], host[1])
}
async function results() { // wrong ?
await server(0, cb => channel.send(cb))
await server(1, cb => channel.send(cb))
await server(2, cb => channel.send(cb))
}
输出:(随机顺序)
results() // not the order I wanted
Server #3: Up.
Server #1: Up.
Server #2: Down: getaddrinfo ENOTFOUND jhfg87ed4.com
解决方法(不好的做法)
server(0, cb => {
channel.send(cb)
server(1, cb => {
channel.send(cb)
server(2, cb => {
channel.send(cb)
})
})
})
使用这个解决方法可以修复它并且像一个魅力一样工作,但我想避免这种回调地狱,因为这显然是不好的做法。
我将不胜感激任何帮助。
MMTTMM
相关分类