簡體   English   中英

我不知道如何應用異步/等待概念

[英]I don't know how to apply async/await concept

我有以下功能:

    let updateDevicesStatus = async () => {
       getAllConnectedClients()
       let teste = getAllDevices()

       try {
          devicesDB = await teste
       } catch (e) {
          console.log('deu erro')
       }
       devicesDB.forEach( (currentDevice) => {
          connectedClients.forEach( (currentClient) => {
             if (arduinoNM.connected[currentClient].clientID == currentDevice.clientID) {
                devicesOnline.push(currentDevice)
             } else {
                devicesOffline.push(currentDevice)
             }
          })
       })
}

getAllDevices()檢索數據庫上的某些數據,因此執行起來需要更多時間。

Node.JS異步運行所有這些調用,這導致異常,表明devicesDB未定義。

我試圖使用async / await來使updateDevicesStatus()等待getAllDevices()執行,但這沒有發生...

我做錯了什么?

getAllDevices()未使用異步聲明。 我應該做嗎?

編輯:

getAllDevicesPromise()函數:

function getAllDevicesPromise() {
            return new Promise((resolve,reject) => {
                resolve(getAllDevices())
            })
        }

getAllDevices()函數:

function getAllDevices() {
            let rst
            let query = Arduino.where({})
            query.find( (err, results) => {
                if (err) return console.error('[ERR] Erro buscando todos os dispositivos do banco para WEB.')
                rst = results
            })
            return rst
        }

我正在測試這些功能,如下所示:

let test = await getAllDevicesPromise()
console.log(test)

但是它仍然返回未定義。 還有什么我需要做的嗎?

let teste = getAllDevices() ... devicesDB = await teste

^^這將無法按您預期的那樣工作,因為您正在調用getAllDevices,將返回值分配給teste,然后什么也沒有等待。

應該只是:

let devicesDB = await getAllDevices();

您可以:

使用async/await這是Javascript中的Promises語法糖) ,您需要對getAllDevices()函數進行承諾,以使用查詢結果進行resolve ,然后在async updateDevicesStatus await

function getAllDevices() {
    return new Promise((resolve, reject) => {
        let rst;
        let query = Arduino.where({});
        query.find((err, results) => {
          if (err) reject('[ERR] Erro buscando todos os dispositivos do banco para WEB.');

          resolve(results);
       });
    });
}

let updateDevicesStatus = async () => {
  getAllConnectedClients();

  let devicesDB = await getAllDevices();

  devicesDB.forEach((currentDevice) => {
    connectedClients.forEach((currentClient) => {
      if (arduinoNM.connected[currentClient].clientID == currentDevice.clientID) {
        devicesOnline.push(currentDevice);
      } else {
        devicesOffline.push(currentDevice);
      }
    });
  });
}

或使用回調:

function getAllDevices(cb) {
  let rst;
  let query = Arduino.where({});
  query.find((err, results) => {
    if (err) cb('[ERR] Erro buscando todos os dispositivos do banco para WEB.');

    cb(null, results);
  })
}

let updateDevicesStatus = () => {
  getAllConnectedClients()

  getAllDevices((err, devicesDB) => {
    if(err) // do something with the error

    devicesDB.forEach((currentDevice) => {
    connectedClients.forEach((currentClient) => {
      if (arduinoNM.connected[currentClient].clientID == currentDevice.clientID) {
        devicesOnline.push(currentDevice);
      } else {
        devicesOffline.push(currentDevice);
      }
    });
  });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM