2015-06-23 11 views
19

Ho scoperto nel modo più duro che non si può semplicemente passare la funzione di un oggetto in Bluebird then. Suppongo che Blue2 then di Bluebird stia facendo un po 'di magia e avvolga la funzione passata in una funzione anonima. Quindi ho allegato un .bind alla funzione e ha funzionato. È questo il modo corretto per farlo con bluebird? O c'è un modo migliore?Il modo corretto di associare l'oggetto all'argomento Promise.then()

So che nulla di tutto questo è asincrono, quindi per favore prova con l'esempio di sincronizzazione, il mio utilizzo è asincrono.

+0

Non hanno sentito parlare di Bluebird, ma se le sue promesse segui il modello Promise implementato da jQuery, quindi questa è la strada da percorrere, purché tu stia mirando a browser moderni che supportano 'Function.bind' (altrimenti dovresti eseguire il rollover o usare Underscore per un' bind' shim) – Lambart

+0

Sicuro. Se @thefourtheye ha ragione e questo 'Promise' ha la sua funzione' bind', probabilmente lo userò. – Lambart

+0

@Lambart È una funzione specifica bluebird :-) – thefourtheye

risposta

22

Così ho collegato un .bind alla funzione e ha funzionato. È questo il modo corretto per farlo con bluebird?

Sì, questo è un modo per mantenere il contesto. Puoi anche passare una funzione anonima (potresti già saperlo).

Promise.resolve("cherry") 
    .then(function (value) { 
     return chair.build(value); 
    }) 
    .then(console.log); 

o c'è qualche modo migliore?

si può effettivamente utilizzare il metodo di Bluebird Promise.bind, come questo

Promise.resolve("cherry") 
    .bind(chair) 
    .then(chair.build) 
    .then(console.log) 

Ora, ogni volta che i gestori di promessa (soddisfare i gestori o gestori di scarto) vengono chiamati, all'interno della funzione, this farà riferimento solo l'oggetto chair .


Nota 1: In questo caso specifico, console.log ottiene anche this come chair oggetto, ma funziona ancora bene, perché, in Node.js, console.log funzione è definita non solo sul prototipo bu anche sull'oggetto stesso, associato all'oggetto console. Il codice corrispondente è here.

Nota 2: Se diversi gestori hanno bisogno di contesti diversi, allora meglio di scrittura funzioni anonime. In tal caso, Promise.bind non sarà di grande aiuto. Ma se si sceglie di usarlo, allora è necessario utilizzare diversi contesti per ciascuno dei gestori e il codice potrebbe essere simile a questo

var chair1 = new Chair("red") 
var chair2 = new Chair("green") 

Promise.resolve("cherry") 
    .bind(chair1)   // Changing the binding to `chair1` 
    .then(chair1.build) 
    .tap(console.log) 
    .bind(chair2)   // Changing the binding to `chair2` 
    .then(chair2.build) 
    .tap(console.log); 

Problemi correlati