我具有以下功能:
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)
但是它仍然返回未定义。还有什么我需要做的?
答案 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);
}
});
});
}