Я знаю, что это ужасная идея.Но у меня есть API, который я не могу использовать, пока у меня нет данных, которые я могу получить только асинхронно.Примерно так:
const key = await get_async_data(config) // NOT RIGHT, can't use await at top level
const api = new API(key)
... use api ...
Это на верхнем уровне, вне какой-либо функции, поэтому я не могу просто ждать get_async_data () (он возвращает Promise).Есть ли что-нибудь, кроме как поместить весь мой код в гигантскую асинхронную функцию, чтобы я мог вызвать await?
API
- это просто класс, экспортируемый модулем (которым я управляю).
(Кстати, я думал поместить код для получения ключа в конструктор класса API
, но, конечно, конструкторы также не могут быть асинхронными.)
Я мог бы сделать каждый асинхронный метод API
установить ключесли не установлен, но это довольно агрессивно и подвержено ошибкам.
Так что я на самом деле не спрашиваю, как заставить мой код верхнего уровня ждать столько, сколько я ищу альтернативные способы структурировать это так, чтобы асинхронностьвызов происходит чисто.
Вот еще некоторые подробности на случай, если это поможет.В api.js:
class API {
constructor(key) {
this.key = key
// other stuff
}
async f1(a) {
}
async f2(b, c) {
}
f3() {
return true
}
}
export default API
Затем в местах (многих), где он будет использоваться:
import API from '@/api'
const key = async get_key() // NOPE
const theAPI = new API(key)
async importantMethod(args)
{
return await theAPI.f1(args)
}
async otherMethod()
{
if (theAPI.f3)
return await theAPI.f2(123)
// etc...
}
// ... and so on