Я хочу вернуть dataSet из моей функции-обработчика. Однако он вложен в мою цепочку обещаний. Я пытаюсь использовать await/async, но значение данных все еще не определено. Мысли как это сделать?
handler: (request, h) => {
let data: any;
connection.connect((err) => {
if (err) {
console.error("Error-------> " + err);
}
console.info("Connected as id " + connection.threadId);
connector.getAllEvents()
.then(async dataSet => {
console.info(dataSet);
data = await dataSet;
});
});
return data;
}
Ошибка не возникает, поскольку при входе в консоль выводятся значения, которые я ищу.





Для этого вам нужно заставить handler возвращать Promise, а внутри обработчика обернуть блок connection.connect в Promise.
например
handler: (request, h) => {
// wrap connector.connect(...) in a Promise
return Promise<any>((resolve, reject) => {
connection.connect(err => {
if (err) {
console.error("Error -----> ", err);
// error in connection, propagate error via reject
// and do not continue processing
return reject(err);
}
console.info("Connected as id " + connection.threadId);
connector.getAllEvents()
// don't think you need this to be async
// as connector.getAllEvents() will should return a Promise<T>
// and .then() is like a .map() so its first argument is a T
// rather than a Promise<T>
.then(dataSet => {
console.info(dataSet);
// we finally have our value
// so we propagate it via resolve()
resolve(dataSet);
});
});
});
}
поскольку вы используете return Promise(res,rej) для преобразования cb в обещание, вам не понадобится async в async (request,h) => {, потому что асинхронные функции возвращают обещание.resolve (yourfunctionreturndata), если только что-то странное не происходит с областью действия в hapi
При возврате данные не инициализируются. Вы можете проверить это, добавив еще один оператор журнала непосредственно перед возвратом, вы увидите, что он распечатывается до console.info(dataSet);.
Я не знаю, что возвращает connection.connect (что это за фреймворк?), Но вы можете это обещать. Затем вы либо возвращаете обещание «подключиться и получить данные» и позволяете вызывающему абоненту ждать его, либо вы используете await внутри своей функции и возвращаете данные после выполнения обещания.
благодарю вас! это сработало. это было именно то, что я искал!