J'ai la méthode qui fonctionne comme prévu comme prévu: J'utilise angulaire 9 / électron p> Comment puis-je changer cela pour travailler comme observable? < / p> p>
4 Réponses :
Vous pouvez simplement envelopper une promesse dans ou vous pouvez sauter la promesse et aller de l'avant et créer un observable directement. : p> à partir de code> pour le convertir en un observable:
Impossible d'utiliser celui-ci comme pour une raison quelconque, j'ai besoin de l'exécuter deux fois pour obtenir les données: this.myservice.getdata (). S'abonner (Data => {Ceci.QueryResult = Data;});
Je ne sais pas ce que vous voulez dire par vous "besoin de l'exécuter deux fois" ... Ces deux méthodes fonctionneront plus ou moins la même chose, mais je recommanderais la seconde dans ce cas particulier. Bien que bindnodecallback code> est une bonne option que j'ai oublié, c'est essentiellement un wrapper de commodité autour de la deuxième méthode
J'ai essayé le second qui l'appelait à partir d'un bouton Cliquez. Les données n'apparaissent pas avant mon deuxième clic
Cela ressemble à un problème de détection de changement plus qu'un problème observable. Le déclenchement de la promesse aurait pu masquer une autre question que vous rencontrez. Si vous ajoutez de vous connecter au gestionnaire de souscription, connectez-vous les données au premier clic?
c'est correct ... j'ai essayé Console.log et les données sont sorties au premier clic mais pas sur la vue du composant jusqu'à ce que le second clic
Ouais. Vous avez un bogue dans votre détection de changement alors. Toute méthode observable aura le même résultat. La promesse le masquait. Vous devriez essayer de réparer tout ce qui se passe là-bas car cela pourrait signifier que vous avez des problèmes plus profonds. Utilisez-vous sur la détection de poussée? Ou courir en dehors de ngzone ou utiliser jQuery ou quelque chose?
Pas du tout .... Juste un service et une composante et fonctionnant sur Electron..Je n'auront aucune erreur: O /
Je ne sais pas. Impossible de diagnostiquer un problème de détection de changement sans voir tout le code concerné et de préférer une reproduction de la question. Vous pouvez pirater autour de cela à l'aide de ChangetectorRef du noyau angulaire, mais je ne le recommande pas.
Vous pouvez essayer de retourner un sujet code> rxjs code> observable.
completed$ = new Subject<any>(); getdata(): Observable<any> { const result = new BehaviorSubject<any>(null); const query = `SELECT * FROM table`; this.db.query(query, (error, rows) => { error ? result.error(error) : result.next(rows); }); return result.asObservable(); } ngOnInit() { this.myservice.getdata().pipe( takeUntil(this.completed$) ).subscribe( rows => { if (rows) { // <-- check if response is valid this.data = rows; } }, error => { } ); } ngOnDestroy() { this.completed$.next(); this.completed$.complete(); }
Il y a quelques bugs subtils dans cette méthode. 1. Si le consommateur ne s'abonnait pas immédiatement, suivant code> peut être appelé avant que le consommateur s'abonne et il manquera la valeur, vous pouvez quelque peu résoudre ce problème avec un
replaySubject code> Mais il brise toujours l'attente observable que les choses n'exécuteront que si elles ne sont pas souscrites 2. Quelque chose comme une requête de DB devrait s'attendre à compléter, sans la nécessité de compléter ou de désabonner manuellement, cela pourrait être corrigé avec un opérateur ou une appelant
Complétez code> sur le sujet.
Qu'est-ce que c'est $ $ $? Est-ce que je viens de le définir dans le composant?
@ Joe2020WOW: Les abonnements non clairs peuvent entraîner des fuites de mémoire potentielles. Utilisation de RXJS Tuskuntil () Code> L'opérateur est l'un des moyens de vous assurer que nous fermons l'abonnement.
$ terminé code> peut être un sujet observable qui est terminé dans le
ngondestroy () code> crochet. J'ai mis à jour la réponse.
Mêmes problèmes que les autres. J'ai besoin de l'exécuter deux fois pour obtenir les données: Test () {this.myservice.getdata (). Tuyau (Taketuntille (ceci.cablé $)) .Subscribe (lignes => {this.data = lignes}, erreur => {}); }
@ Joe2020WOW: Je ne comprends pas ce que vous entendez en l'exécutant deux fois. Dans la question que vous vous êtes inscrit dans le Ngoninit () Code> Crochet, vous n'avez donc pas à appeler d'autres fonctions.
Je n'obtiens pas de données quand je l'ai nonginit, alors j'ai essayé de l'appeler comme méthode sur un bouton Cliquez. J'ai réalisé que je n'ai aucune donnée avant d'appeler deux fois ça
@ joe2020WOW: j'ai remplacé le sujet code> code> avec un comportement (code> comportement code> avec la valeur par défaut
null code>. La différence B / N leur est que `` comportementalosubject »pourrait avoir une valeur et l'émettre immédiatement après l'abonnement. Nous devons donc vérifier si la valeur est valide avant de l'attribuer. Réessayez dans
Ngoninit () Code> et voyez si cela fonctionne.
convertir une fonction avec un rappel dont le premier paramètre est erreur code> ("Node.js-style rappel") à Observable est le mieux fait avec
Bindnodecallback code>:
getdata(): Observable<any> {
const query = `SELECT * FROM table`;
return bindNodeCallback(this.db.query)(query)
}
// subscribing:
ngOnInit() {
this.myservice.getdata().subscribe(result => {
this.data = result;
});
}
Je reçois une erreur: impossible de trouver le nom 'bindnodecallback'
La manière la plus appropriée est d'utiliser bindnodecallback code>
getdata(): Promise<any> { return bindNodeCallback(this.db.query)(`SELECT * FROM table`); } ngOnInit() { this.myservice.getdata().subscribe(result => { this.data = result; }); }