亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

盡管異步/等待,Discord 機器人仍以錯誤的順序發送消息

盡管異步/等待,Discord 機器人仍以錯誤的順序發送消息

婷婷同學_ 2023-08-10 10:51:08
我再次遇到這個異步編碼問題,太煩人了。我想避免使用回調地獄,并避免使用new Promise和解析開始,所以我使用async/await了。目標我希望我的 Discord 機器人按照定義的順序在頻道中一個接一個地吐出每個服務器的狀態。問題當然,輸出的順序是錯誤的。我知道每個服務器響應速度是不同的。盡管使用async/await它仍然不能按我想要的方式工作,這讓我感到困惑??磥砦矣缅e了,只是不知道在哪里。我嘗試用循環迭代數組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),所以你應該遵循這個模式

所以你的腳本應該更新如下。

請注意,這是一個無法管理錯誤的快速解決方案?。ㄓ置?code>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 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號