[英]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.