Wie zu verwenden verspricht, oder eine ajax-Anfrage, bevor die Funktion beendet wird?
Habe ich die folgende Funktion zu überprüfen, eine Benutzer-session, um zu sehen, ob Sie Mitarbeiter oder nicht. Nun, ich weiß, es gibt bessere Möglichkeiten, dies zu tun, aber ich bin versucht zu machen, eine einfache Anwendung, die gebunden ist mit einer forum-software.
function isStaff(callback) {
$.ajax({
url: url
}).done(function(data) {
var session = $.parseJSON(data);
if (session.is_staff === 1) {
callback(true);
} else {
callback(false);
}
});
}
Sagen wir, ich bin mit dieser Funktion in etwa so aus, beim kompilieren ein "post" (LENKER).
function compilePost(post) {
var source = $('#feed-item-template').html();
var template = Handlebars.compile(source);
var context = {
id: post.id,
content: post.text,
author: post.author,
date: $.timeago(post.date),
staff: function() {
isStaff(function(response) {
return response;
});
}
}
var html= template(context);
return html;
}
Problem hier ist, dass die Anforderung zu überprüfen, wenn ein Benutzer einen Personal nicht vollständige Antrag bis nach der Funktion ran.
Ich weiß, mit Versprechen ist eine alternative zu async: false, wo der Antrag gestellt wird und die Antwort kommt zurück, bevor die Funktion beendet.
Aber ich habe keine Ahnung wie ich die konvertieren kann dieses in ein Versprechen. Ich habe versucht, es zu lernen, aber ich bin stecken im Konzept. Kann mir das jemand erklären? Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, wir vereinfachen die
compilePost
Funktion. Diese Funktion sollte wissen, wie man kompiliert einen post in einer synchronen Art und Weise. Wir ändern dieisStaff
Holen, um ein einfaches argument.Nun, zunächst erstellen wir eine neue Methode, mit einem einzigen Zweck - der überprüfung, ob ein Benutzer Mitglied der Mitarbeiter:
Diese Funktion wickelt Ihre ursprüngliche
ajax
aufrufen, um den server mit dem Versprechen, wenn die$.ajax
rufen wird eine Antwort vom server, das Versprechen aufgelöst wird, mit der Antwort, ob der Benutzer ein Mitarbeiter ist oder nicht.Nun, wir können schreiben, eine andere Funktion zu orchestrieren den Prozess:
compilePostAsync
findet heraus, ob der Benutzer ein Mitarbeiter ist oder nicht. Dann, es kompiliert die post.Bitte beachten Sie, dass
compilePostAsync
eine Zusage zurückgibt, und damit, wenn Sie so etwas wie:Nun, Sie sollten es ändern, um so etwas wie:
Einige Hinweise:
isStaff
undcheckForStaffMemebership
(original und neu) nicht bekommen, ein argument, ich denke, Sie würde herausfinden, wie übergeben Sie die Benutzer-id oder anderen Daten, die Sie benötigen könnten,Als pro die Dokumentation die Sie nicht brauchen, wickeln Sie das ajax mit einer Verheißung, die bereits implementiert Versprechen. Statt Kette die Antwort ist, wie nachfolgend erläutert.
Man etwas tun kann, wie unten durch die Verkettung der Antwort:
Hinweis: sicher Sein, zu implementieren error-callbacks auch. Weil man nie wissen kann, was
falsch gelaufen 🙂
Einfache Erklärung über Versprechen mit $.aufschieben:
Für das Verständnis, ich habe das Fiddle ähnlich wie Ihre Anforderung.
Erklärung:
Grundsätzlich Versprechen ist eingeführt worden, um zu erreichen synchrone Ausführung asynchrone JS-code.
Was meinst du mit Asynchronen oder Asynchron-code?
Den code, der ausgeführt wird, kann die Rückgabe eines Wertes zu einem bestimmten Punkt der Zeit, die nicht unmittelbar auf. Berühmtes Beispiel zur Unterstützung dieser Aussage wäre
jquery ajax
.Warum ist es erforderlich?
Versprechen Implementierungen unterstützt den Entwickler zu implementieren, die eine synchrone code-block, der abhängig von der asynchrone code-block für die Antwort. wie in der ajax-Aufruf, wenn ich eine Anfrage an den server zu Fragen, für einen Daten-string, muss ich warten, bis der server antwortet mir mit einem Antwort-string data, die meine synchronous code verwendet es, um es zu manipulieren , tun Sie einige Logik und das aktualisieren des UI.
Folgen Sie diesem link wo hat der Autor erläutert mit ausführlichen Beispielen.
PS: Jquery
$.defer
implementiert oder wrapspromise
ganz anders. Beide sind für den gleichen Zweck eingesetzt.