2016-09-28 6 views
9

Sowohl Versprechungen als auch AJAX-Aufrufe sind asynchrone Vorgänge. Eine GET/POST-Anfrage könnte mit beiden gemacht werden. < Bearbeiten: das ist eine falsche AnweisungWas ist der Unterschied zwischen Promise und AJAX?

Also, was ist der Unterschied zwischen ihnen? Und wann wäre es besser, einen statt den anderen zu benutzen?

Auch eine weitere Sache:

Vor kurzem stieß ich auf ein Versprechen, das in seinem Körper eine AJAX hatte. Warum sollte eine asynchrone Operation in eine asynchrone Operation eingefügt werden? Das ist, als würde man ein Brotbrot in ein Brot-Sandwich legen.

EDIT: Ich entschuldige mich nicht früher ein Beispiel bereitstellt:

function threadsGet() { 
return new Promise((resolve, reject) => { 
    $.getJSON('api/threads') 
    .done(resolve) 
    .fail(reject); 
    }) 
} 

jQuery hier verwendet wird. Und der AJAX-Aufruf hat Promise-Verhalten und -Eigenschaften. Ich habe das vorher nicht verstanden, aber hier sind meine Gedanken: Wir können etwas in der Verheißung tun. Verwenden Sie dann den AJAX-Aufruf und übergeben Sie in der done-Funktion die aufgelöste Promise-Logik. Speziell in diesem Beispiel gibt es keine.

Jetzt sehe ich, dass ich beide verwirrt hatte. Sie sind so ziemlich 2 verschiedene Dinge. Nur weil sie asynchron sind, heißt das nicht, dass sie austauschbar sind.

==============

EDIT 2: Nur einige Materialien, die ich gefunden nützlich:

Promise Anti-Patterns

+0

Können Sie bitte klären was meinst du, wenn du sagst, dass du GET/POST-Anfragen mit einem _promise_ machen kannst? –

+2

Ein Versprechen an sich hat keinen Mechanismus, um GET/POST-Anfragen zu stellen. Vielleicht lesen Sie die [Promises Dokumentation] (http://stackoverflow.com/documentation/javascript/231/promises/846/introduction#t=201609281521002304613)? –

+2

Ein Promise ist eine * Schnittstelle * für asynchrone Operationen. Eine Ajax-Anfrage ist eine sehr spezifische asynchrone Operation. – Bergi

Antwort

24

Sie sind verwirrt über Versprechungen und Ajax Anrufe. Sie sind wie Äpfel und Messer. Sie können einen Apfel mit Messer schneiden und das Messer ist ein Werkzeug, das auf einen Apfel aufgetragen werden kann, aber die beiden sind sehr unterschiedliche Dinge.

Versprechen sind ein Werkzeug zur Verwaltung asynchroner Operationen. Sie verfolgen, wann asynchrone Vorgänge abgeschlossen sind und was ihre Ergebnisse sind, und Sie können diese Beendigung und diese Ergebnisse (einschließlich Fehlerbedingungen) mit anderem Code oder anderen asynchronen Vorgängen koordinieren. Sie sind eigentlich keine asynchronen Operationen an sich. Ein Ajax-Aufruf ist eine bestimmte asynchrone Operation, die mit einer herkömmlichen Callback-Schnittstelle oder in einer Promise-Schnittstelle verwendet werden kann.

Was ist der Unterschied zwischen ihnen? Und wann wäre es am besten, einen statt den anderen zu verwenden?

Ein Ajax-Aufruf ist eine bestimmte Art von asynchronem Vorgang. Sie können einen Ajax-Anruf entweder mit einem herkömmlichen Rückruf unter Verwendung der XMLHttpRequest interface oder Sie können einen Ajax-Anruf (in modernen Browsern), unter Verwendung eines Versprechens mit der fetch() interface.

Kürzlich stieß ich auf ein Versprechen, das einen AJAX in seinem Körper hatte. Warum setzt eine asynchrone Operation in eine asynchrone Operation? Das ist so, als würde man ein Brotbrot in ein Brot-Sandwich stecken.

Sie nicht zeigen, den spezifischen Code Sie gesprochen haben, aber manchmal will man Asynchron-Betrieb 1 und dann starten, wenn die Async Betrieb durchgeführt wird, möchten Sie sie async Betrieb 2 (oft starten, um die Ergebnisse mit von der ersten). In diesem Fall verschachteln Sie normalerweise ineinander.


Ihr Code Beispiel hier:

function threadsGet() { 
    return new Promise((resolve, reject) => { 
     $.getJSON('api/threads') 
     .done(resolve) 
     .fail(reject); 
     }) 
} 

ist ein Versprechen, anti-Muster betrachtet. Es gibt keinen Grund, ein neues Versprechen zu erstellen, da $.getJSON() bereits ein Versprechen zurückgibt, das Sie zurückgeben können. Sie können dies nur tun, anstatt:

function threadsGet() { 
    return $.getJSON('api/threads'); 
} 

Oder, wenn Sie den etwas Nicht-Standard-jQuery Versprechen zu einem Standard-Versprechen „cast“ möchten, können Sie dies tun:

function threadsGet() { 
    return Promise.resolve($.getJSON('api/threads')); 
} 
+0

Danke! A aktualisiert meine Frage mit einem Beispiel eines AJAX in einem Versprechen. Und ich habe schon die Idee davon. :) – Bruno

+0

Vielen Dank für das Update! Ich wusste nicht einmal, dass es gute/schlechte Praktiken mit Versprechen gibt. Ich mag deinen optimierten Code. Es ist viel verständlicher und eleganter. Die Sache, die mich in dem Code, den ich gepostet habe, sehr verwirrt hat, war - Ajax, der den Erfolg des äußeren Versprechens gelöst hat und (schließlich) seinen Fehler versäumt hat. Aber jetzt ist es klar. :) – Bruno

Verwandte Themen