È “.then (function (a) {return a;})” un no-op per le promesse?

Sto leggendo questo tutorial su Bookshelf . Bookshelf usa le promesse di Bluebird. Ci sono alcuni esempi che assomigliano a questo:

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

Non mi sento ancora a mio agio con le promesse, ma da quello che ho imparato finora sembra strano. La mia domanda è, è la funzione di cui sopra esattamente come restituire fetch() direttamente e lasciando fuori la finale then() :

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

Cioè, fa sempre la stessa cosa, restituisce la stessa promise, può essere chiamata allo stesso modo, ecc.?

Da quanto ho capito, il parametro passato alla funzione ottiene il valore di ritorno della precedente promise nella catena. Quindi, mi sembra come. .then(function (a) { return a; }) in generale è solo un no-op. Destra?

Se non sono uguali, qual è la differenza? Cosa sta succedendo e perché l’autore ha scritto così?

Sembra a me. .then(function (a) { return a; }) è solo un no-op. Destra?

Sì. 1

È inutile e dovrebbe essere omesso.

Cosa sta succedendo e perché l’autore ha scritto così?

È un errore. O l’autore non ha capito le promesse.

1: Se non sono uguali, qual è la differenza?

Come sempre, ci sono alcuni casi limite. Davvero strani. Che nessuno dovrebbe usare (senza ampi commenti):
a) restituisce una nuova istanza di promise, un object distinto, per evitare la condivisione. Tuttavia, anche .then() .
b) a viene nuovamente testato per la sua idoneità. Se improvvisamente è diventata una promise dopo l’adempimento, ora sarà attesa. Questo sarebbe terribile, naturalmente.

La risposta di Bergi è giusta, ma solo per dimostrare un caso in cui non è un no-op ecco un esempio forzato in cui non è un no-op:

 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 

In generale, non farlo then(function(a) { return a; })