W ogóle, że to zły pomysł. Pozwól mi powiedzieć, dlaczego. JavaScript w przeglądarce jest w zasadzie potworem z pojedynczym gwintem. Pomyśl o tym, jest to również pojedynczy wątek w Node.js też. Więc wszystko, co robisz, aby nie "zwracać" w momencie, w którym zaczniesz czekać na zdalną prośbę o sukces lub niepowodzenie, będzie prawdopodobnie wymagało pewnego rodzaju pętli, aby opóźnić wykonanie kodu po żądaniu. Coś takiego:
var semaphore = false;
var superImportantInfo = null;
// Make a remote request.
$http.get('some wonderful URL for a service').then(function (results) {
superImportantInfo = results;
semaphore = true;
});
while (!semaphore) {
// We're just waiting.
}
// Code we're trying to avoid running until we know the results of the URL call.
console.log('The thing I want for lunch is... " + superImportantInfo);
Ale jeśli spróbujesz, że w przeglądarce, a połączenie trwa zbyt długo, przeglądarka pomyśli kodu JavaScript utknął w pętli i pojawiają się wiadomości w twarz autora dając użytkownik ma szansę zatrzymać swój kod. dlatego JavaScript struktur IT tak:
// Make a remote request.
$http.get('some wonderful URL for a service').then(function (results) {
// Code we're trying to avoid running until we know the results of the URL call.
console.log('The thing I want for lunch is... " + results);
});
// Continue on with other code which does not need the super important info or
// simply end our JavaScript altogether. The code inside the callback will be
// executed later.
Pomysł jest, że kod w zwrotnego zostanie wywołany przez zdarzenie ilekroć powraca wzywania serwisu. Ponieważ kierowane zdarzeniami jest to, jak JavaScript je lubi. Timery w JavaScript to zdarzenia, akcje użytkownika to zdarzenia, połączenia HTTP/HTTPS do wysyłania i odbierania danych również generują zdarzenia. Oczekuje się, że skonstruujesz swój kod, aby zareagował na te zdarzenia, gdy nadejdą.
Nie możesz ustrukturyzować swojego kodu w taki sposób, że uważa on, że wartośćA może być fałszywa, dopóki zdalne wywołanie usługi nie powróci i może się okaże, że to prawda? Robię to cały czas w kodzie AngularJS, gdzie nie wiem, jaki jest ostateczny zestaw uprawnień, które powinienem pokazać użytkownikowi, ponieważ jeszcze ich nie otrzymałem lub nie otrzymałem wszystkich danych do wyświetlenia w strona na początku. Mam wartości domyślne, które wyświetlają się, dopóki nie pojawią się prawdziwe dane, a następnie strona dostosuje się do nowego formularza na podstawie nowych danych. Dwukierunkowe wiązanie AngularJS sprawia, że jest to naprawdę łatwe.
Tak, masz kilka bardzo dobrych punktów. Mogę zdecydowanie ukształtować mój kod w ten sposób i nie powinno to być zbyt trudne. Byłem bardziej ciekawy, czy istnieje sposób, aby to zrobić, ale wyperswadowałeś mi z tego pożytku. Podoba mi się pomysł nieuzyskania dostępu, a następnie umożliwienie dwustronnego zajęcia się resztą. Dzięki. –
W pierwszym przykładzie nie sądzę, aby warunek dla stwierdzenia 'while' był zawsze zgodny z prawdą. Dzieje się tak dlatego, że będzie on działał synchronicznie i zablokuje żądanie HTTP od zawsze. – mightyiam
W niektórych przypadkach naprawdę chcesz poczekać, myślę, że to było oryginalne pytanie. Ta odpowiedź tak naprawdę nie odpowiada. –