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

我再次遇到这个异步编码问题,太烦人了。我想避免使用回调地狱,并避免使用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)

        })

    })

})

使用这个解决方法可以修复它并且像一个魅力一样工作,但我想避免这种回调地狱,因为这显然是不好的做法。


我将不胜感激任何帮助。


婷婷同学_
浏览 138回答 1
1回答

MMTTMM

脚本中有一些错误: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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript