为了账号安全,请及时绑定邮箱和手机立即绑定

尽管异步/等待,Discord 机器人仍以错误的顺序发送消息

尽管异步/等待,Discord 机器人仍以错误的顺序发送消息

婷婷同学_ 2023-08-10 10:51:08
我再次遇到这个异步编码问题,太烦人了。我想避免使用回调地狱,并避免使用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 wantedServer #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)        })    })})使用这个解决方法可以修复它并且像一个魅力一样工作,但我想避免这种回调地狱,因为这显然是不好的做法。我将不胜感激任何帮助。
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

脚本中有一些错误:

  • async不打电话await是没有用的

  • 通常使用回调来代替await,不能同时使用

  • 通用回调接口是callback(error, data),所以你应该遵循这个模式

所以你的脚本应该更新如下。

请注意,这是一个无法管理错误的快速解决方案!(又名error事件)

const status = require('net')

const util = require('util')


const hosts = [

  ['Server #1', 'google.com', 80],

  ['Server #2', 'jhfg87ed4.com', 80], // fake, just for response check

  ['Server #3', 'stackoverflow.com', 80]

]


function server (id, cb) {

  const host = hosts[id]

  const sock = new status.Socket()

  sock.setTimeout(2500)

  sock

    .on('connect', () => {

      cb(null, host[0] + ': Up.') // null as first parameter that is error

      sock.destroy()

    })

    .on('error', e => {

      cb(new Error(host[0] + ': Down: ' + e.message))

    })

    .on('timeout', e => {

      cb(new Error(host[0] + ' Down: timeout'))

    })

    .connect(host[2], host[1])

}


const serverPromise = util.promisify(server)


async function results () {

  let res = await serverPromise(0)

  console.log(res)

  try {

    res = await serverPromise(1)

    console.log(res)

  } catch (error) {

    console.log(error)

  }

  res = await serverPromise(2)

  console.log(res)

}


results()


查看完整回答
反对 回复 2023-08-10
  • 1 回答
  • 0 关注
  • 51 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信