我不知道如何应用异步/等待概念

时间:2018-06-30 02:05:45

标签: javascript node.js async-await

我具有以下功能:

    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)

但是它仍然返回未定义。还有什么我需要做的?

2 个答案:

答案 0 :(得分:0)

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

^^这将无法按您预期的那样工作,因为您正在调用getAllDevices,将返回值分配给teste,然后什么也没有等待。

应该是:

let devicesDB = await getAllDevices();

答案 1 :(得分:0)

您可以:

使用async/await(它是Syntactic Sugar For Promises in Javascript),您需要根据查询结果将getAllDevices()函数推广到resolve,然后将{{1} } await

async updateDevicesStatus

或使用回调:

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);
      }
    });
  });
}