У меня очень простое требование:
Я пишу сервис авторизации для сайта Angular (Angular 7 имеет значение).Службе нужна функция hasPermission, которая принимает имя пользователя и имя ресурса.Он делает Http.Get()
вызов бэкэнда, чтобы определить, авторизован ли пользователь для доступа к этому ресурсу.Когда и ТОЛЬКО КОГДА данные возвращаются после вызова Get()
, они возвращают true или false.
Я искал в Интернете около недели, пытаясь выяснить, как это сделать.Моя проблема в том, что Http.Get()
возвращает наблюдаемое И ПОТОМ ПРОДОЛЖАЕТСЯ.Это означает, что функция возвращается до того, как получит данные для принятия решения.То же самое, если я использую Http.Get().toPromise()
- функция продолжится, как только будет создано обещание.
Кажется, что каждое «решение», которое я читаю, представляет собой некоторый вариант «вернуть обещание» или «вернутьнаблюдаемым».Но тогда это аналогично «Это черепахи все время вниз» - в этом случае, это обещания (или наблюдаемые) все время вверх.В какой-то момент должен быть метод, который ожидает и возвращает данные, а не обещание данных или наблюдаемые данные.
Мне нужен какой-то способ добавить «waitForDone» после созданияНаблюдаемый или обещаемый, и до того, как функция вернет свое значение, но из всего, что я могу найти, вы не можете сделать это в JavaScript, потому что он однопоточный.Обратите внимание, что я не могу, как предлагали некоторые решения, «просто поместить код после http.get(...)
в отдельную функцию и вызвать его из обратного вызова из-за успеха», потому что код, который должен быть выполнен, должен возвращаться из этой функции.
А async / await этого не делает, потому что async превращает всю функцию в обещание, поэтому, даже если await может ждать, пока Get()
вернет данные, функция все равно продолжит работу и вернетсязвонящему до того, как он получил необходимые данные.
Мне не кажется, что это необычное требование.Хотя приятно иметь возможность отправить запрос, а затем сделать что-то еще, пока вы ждете возвращения данных, должны быть моменты, когда вы ДОЛЖНЫ иметь данные, прежде чем сможете сделать что-либо еще.
Любойпомощь приветствуется.