Ist “.then(function(a){ return a; })” ein No-Op für Promises?

Lesezeit: 3 Minuten

ich lese dieses Tutorial über Bookshelf. Bookshelf verwendet Bluebird-Versprechen. Es gibt einige Beispiele, die etwa so aussehen:

var getEvents = function(participantId) {  
  return new models.Participant()
    .query({where: {id: participantId}})
    .fetch({withRelated: ['events'], require: true})
    .then(function(model) {
      return model;
    });
};

Ich fühle mich immer noch nicht wohl mit Versprechungen, aber nach dem, was ich bisher gelernt habe, erscheint mir das seltsam. Meine Frage ist, ist die obige Funktion genau die gleiche wie die Rückkehr fetch() direkt und das Finale weglassen then():

var getEvents = function(participantId) {  
  return new models.Participant()
    .query({where: {id: participantId}})
    .fetch({withRelated: ['events'], require: true});
};

Das heißt, es tut immer noch dasselbe, gibt dasselbe Versprechen zurück, kann auf dieselbe Weise aufgerufen werden usw.?

Soweit ich weiß, wird der Parameter an die Funktion übergeben then erhält den Rückgabewert des vorherigen Versprechens in der Kette. So kommt es mir vor .then(function (a) { return a; }) im Allgemeinen ist nur ein No-Op. Rechts?

Wenn sie nicht gleich sind, was ist der Unterschied? Was ist los und warum hat der Autor es so geschrieben?

  • .then(function(model) { return model; }); ist nutzlos und kann (und sollte) fallen gelassen werden.

    – dfq

    11. Dezember 2016 um 17:51 Uhr

  • das macht Sinn, wenn fetch Handler kann einige Parameter bereitstellen. Danach würde sich das Versprechen nur mit einem lösen.

    – Grundi

    11. Dezember 2016 um 17:52 Uhr

  • Autor zuletzt hinzugefügt then um zu zeigen, dass Sie in diesem Schritt manipulieren können model

    – Stasowlas

    11. Dezember 2016 um 17:52 Uhr


  • Ein häufiger Grund für das Extra .then() ist, damit Sie das Ergebnis dort protokollieren oder einen Haltepunkt darauf setzen können, um es zu überprüfen. Das sollte wahrscheinlich vor der allgemeinen Veröffentlichung entfernt werden, aber manchmal ist es deshalb da. Oder der Autor dachte, dass er das Ergebnis vielleicht ein wenig verarbeiten möchte, bevor er es zurücksendet, und hat es dann nicht geschafft. Oder dies wurde nur zu Bildungszwecken getan, um besser zu veranschaulichen, was das Rückgabeergebnis war.

    – jfriend00

    11. Dezember 2016 um 18:28 Uhr


Es scheint mir so .then(function (a) { return a; }) ist nur ein no-op. Rechts?

Jawohl.1

Es ist nutzlos und sollte weggelassen werden.

Was ist los und warum hat der Autor es so geschrieben?

Es ist ein Fehler. Oder der Autor hat Versprechungen nicht verstanden.

1: Wenn sie nicht gleich sind, was ist der Unterschied?

Wie immer gibt es einige Grenzfälle. Wirklich seltsame. Das sollte niemand verwenden (ohne ausführlich zu kommentieren):
a) es gibt eine neue Promise-Instanz zurück, ein eindeutiges Objekt, um eine gemeinsame Nutzung zu vermeiden. Aber, .then() würde auch.
B) a wird erneut auf seine Aktualität geprüft. Wenn es seit der Erfüllung plötzlich zu einem Versprechen wurde, wird es jetzt erwartet. Das wäre natürlich schrecklich.

  • Der Fall “b” klingt schrecklich.

    – Jason C

    11. Dezember 2016 um 18:01 Uhr


Bergis Antwort ist richtig, aber nur um einen Fall zu demonstrieren, in dem es kein No-Op ist, hier ein erfundenes Beispiel, in dem es kein No-Op ist:

o = {};
Promise.resolve(o).then(o => o.then = () => {}); // make thenable
Promise.resolve(o).then(console.log); // logs the object
Promise.resolve(o).then(x => x).then(console.log); // doesn't log the object

Im Allgemeinen nicht tun then(function(a) { return a; })

  • Ich habe gesehen, dass dies tatsächlich einmal in wirklich schlecht konstruiertem Code passiert ist. Ich werde es nicht so leicht vergessen.

    – Benjamin Grünbaum

    11. Dezember 2016 um 18:03 Uhr

  • Ich habe die genauen Schritte ausprobiert, Promise.resolve(o).then(console.log); kehrt zurück Promise {<pending>} Anstatt das Objekt zu protokollieren, macht der nächste Schritt dasselbe

    – TJ

    22. April 2021 um 13:13 Uhr


895900cookie-checkIst “.then(function(a){ return a; })” ein No-Op für Promises?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy