3 votes

comment utiliser rxjs bindCallback

J'essaie d'utiliser bindCallback pour mqtt-client connect-event ( https://www.npmjs.com/package/mqtt#event-connect ) et j'obtiens une erreur. Qu'est-ce que je fais de mal ?

const client = mqtt.connect("...")
const clientOnObs = bindCallback(client.on)
clientOnObs('connect').subscribe(console.log)

erreur

TypeError: Cannot read property '_events' of undefined
    at _addListener (events.js:203:19)
    at addListener (events.js:259:10)
    at Observable._subscribe (/Users/robert.rajakone/repos/2018_diprem/example-message-simulator/node_modules/rxjs/src/internal/observable/bindCallback.ts:215:26)
    at Observable._trySubscribe (/Users/robert.rajakone/repos/2018_diprem/example-message-simulator/node_modules/rxjs/src/internal/Observable.ts:231:19)
    at Observable.subscribe (/Users/robert.rajakone/repos/2018_diprem/example-message-simulator/node_modules/rxjs/src/internal/Observable.ts:212:14)
    at Object.<anonymous> (/Users/robert.rajakone/repos/2018_diprem/example-message-simulator/main.ts:30:24)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Module.m._compile (/usr/local/lib/node_modules/ts-node/src/index.ts:439:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Object.require.extensions.(anonymous function) [as .ts] (/usr/local/lib/node_modules/ts-node/src/index.ts:442:12)

paquet.json

{
  "dependencies": {
    "i": "^0.3.6",
    "mqtt": "^2.18.8",
    "rxjs": "^6.4.0"
  }
}

node -v
v10.10.0

npm -v
6.5.0

3voto

Andi Kleinbichler Points 133

Lorsque vous voulez utiliser bindCallback sur la fonction d'un objet, vous devez prendre soin du contexte. L'opération bindCallback invoquera la fonction avec apply et en passant ceci comme contexte actuel. Pour résoudre ce problème, vous pouvez réécrire votre code de la manière suivante :

const clientOnObs = bindCallback(client.on);
clientOnObs.call(client, 'connect').subscribe(console.log);

1voto

robie2011 Points 468

Voir aussi https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

Un autre style :

const client = mqtt.connect("...")
const clientOnObs = bindCallback(client.on).bind(client)
clientOnObs('connect').subscribe(console.log)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X