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);
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
Sicuro. Se @thefourtheye ha ragione e questo 'Promise' ha la sua funzione' bind', probabilmente lo userò. – Lambart
@Lambart È una funzione specifica bluebird :-) – thefourtheye