Gibt es eine Möglichkeit, einen synchronen Anruf mit AngularJS zu tätigen?
Die AngularJS-Dokumentation ist nicht sehr explizit oder umfangreich, um einige grundlegende Dinge herauszufinden.
AUF EINEM DIENST:
myService.getByID = function (id) {
var retval = null;
$http({
url: "/CO/api/products/" + id,
method: "GET"
}).success(function (data, status, headers, config) {
retval = data.Data;
});
return retval;
}
Antworten:
Derzeit nicht. Wenn Sie sich den Quellcode ansehen (ab diesem Zeitpunkt, Oktober 2012) , werden Sie feststellen, dass der Aufruf von XHR open tatsächlich fest codiert ist, um asynchron zu sein (der dritte Parameter ist wahr):
Sie müssten Ihren eigenen Dienst schreiben, der synchrone Anrufe tätigt. Im Allgemeinen möchten Sie dies aufgrund der Art der JavaScript-Ausführung normalerweise nicht tun, um alles andere zu blockieren.
... aber ... wenn das Blockieren von allem anderen tatsächlich gewünscht ist, sollten Sie sich vielleicht die Versprechen und den $ q-Service ansehen . Sie können warten, bis eine Reihe von asynchronen Aktionen ausgeführt wurden, und dann etwas ausführen, sobald alle abgeschlossen sind. Ich weiß nicht, was Ihr Anwendungsfall ist, aber das könnte einen Blick wert sein.
Abgesehen davon finden Sie hier weitere Informationen dazu, wie Sie synchrone und asynchrone Ajax-Aufrufe tätigen können .
Ich hoffe das ist hilfreich.
quelle
.then(callback)
. so etwas wie :doSomething(); $http.get('/a/thing').then(doEverythingElse);
.Ich habe mit einer Fabrik gearbeitet, die in die automatische Vervollständigung von Google Maps integriert ist, und Versprechungen gemacht. Ich hoffe, Sie dienen.
http://jsfiddle.net/the_pianist2/vL9nkfe3/1/
Sie müssen den autocompleteService nur durch diese Anforderung ersetzen, indem $ http incuida vor der Fabrik steht.
und $ http Anfrage mit
Die Frage selbst ist zu stellen:
wenn du es gut gemacht hast und die Anfrage:
wenn es einen Fehler gibt und dann:
quelle
quelle
Ich bin kürzlich in eine Situation geraten, in der ich $ http-Anrufe tätigen wollte, die durch ein erneutes Laden der Seite ausgelöst wurden. Die Lösung, mit der ich mich entschieden habe:
quelle
Hier ist eine Möglichkeit, wie Sie dies asynchron tun und Dinge wie gewohnt verwalten können. Alles wird noch geteilt. Sie erhalten einen Verweis auf das Objekt, das Sie aktualisieren möchten. Wann immer Sie dies in Ihrem Dienst aktualisieren, wird es global aktualisiert, ohne dass Sie ein Versprechen beobachten oder zurückgeben müssen. Dies ist sehr hilfreich, da Sie das zugrunde liegende Objekt innerhalb des Dienstes aktualisieren können, ohne es erneut binden zu müssen. Verwenden Sie Angular so, wie es verwendet werden soll. Ich denke, es ist wahrscheinlich eine schlechte Idee, $ http.get / post synchron zu machen. Sie erhalten eine merkliche Verzögerung im Skript.
Und irgendwo in einer Ansicht:
quelle
Da die Synchronisierung von XHR veraltet ist, sollten Sie sich nicht darauf verlassen. Wenn Sie eine POST-Synchronisierungsanforderung ausführen müssen, können Sie die folgenden Helfer innerhalb eines Dienstes verwenden, um einen Formularbeitrag zu simulieren.
Dazu wird ein Formular mit ausgeblendeten Eingaben erstellt, das an die angegebene URL gesendet wird.
Ändern Sie sie nach Bedarf.
quelle
Was ist mit dem Umschließen Ihres Aufrufs in eine
Promise.all()
Methode, dhPromise.all([$http.get(url).then(function(result){....}, function(error){....}])
Laut MDN
quelle