Использование Angular Http.Get () синхронно - PullRequest
0 голосов
/ 18 апреля 2019

У меня очень простое требование:

Я пишу сервис авторизации для сайта Angular (Angular 7 имеет значение).Службе нужна функция hasPermission, которая принимает имя пользователя и имя ресурса.Он делает Http.Get() вызов бэкэнда, чтобы определить, авторизован ли пользователь для доступа к этому ресурсу.Когда и ТОЛЬКО КОГДА данные возвращаются после вызова Get(), они возвращают true или false.

Я искал в Интернете около недели, пытаясь выяснить, как это сделать.Моя проблема в том, что Http.Get() возвращает наблюдаемое И ПОТОМ ПРОДОЛЖАЕТСЯ.Это означает, что функция возвращается до того, как получит данные для принятия решения.То же самое, если я использую Http.Get().toPromise() - функция продолжится, как только будет создано обещание.

Кажется, что каждое «решение», которое я читаю, представляет собой некоторый вариант «вернуть обещание» или «вернутьнаблюдаемым».Но тогда это аналогично «Это черепахи все время вниз» - в этом случае, это обещания (или наблюдаемые) все время вверх.В какой-то момент должен быть метод, который ожидает и возвращает данные, а не обещание данных или наблюдаемые данные.

Мне нужен какой-то способ добавить «waitForDone» после созданияНаблюдаемый или обещаемый, и до того, как функция вернет свое значение, но из всего, что я могу найти, вы не можете сделать это в JavaScript, потому что он однопоточный.Обратите внимание, что я не могу, как предлагали некоторые решения, «просто поместить код после http.get(...) в отдельную функцию и вызвать его из обратного вызова из-за успеха», потому что код, который должен быть выполнен, должен возвращаться из этой функции.

А async / await этого не делает, потому что async превращает всю функцию в обещание, поэтому, даже если await может ждать, пока Get() вернет данные, функция все равно продолжит работу и вернетсязвонящему до того, как он получил необходимые данные.

Мне не кажется, что это необычное требование.Хотя приятно иметь возможность отправить запрос, а затем сделать что-то еще, пока вы ждете возвращения данных, должны быть моменты, когда вы ДОЛЖНЫ иметь данные, прежде чем сможете сделать что-либо еще.

Любойпомощь приветствуется.

1 Ответ

1 голос
/ 18 апреля 2019

Вы можете использовать синтаксис async-await: вместо

get(someArgs).subscribe(doStuff);

вы можете поставить async в объявлении функции и затем сделать следующее

const someVal = await get(someArgs).toPromise();
doStuff(someVal); // this line won't execute until get() has resolved the promise

Но, по сути,, это это черепах полностью вниз.Это синтаксический сахар поверх рецепта Promise, и вот к чему он попадает (если вы его переносите).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...