2017-08-07 4 views
2

Ich habe eine Angular App mit angularfire2 und ich verwende eine Methode, die einige Informationen aus ein paar verschiedenen Tabellen in Firebase entfernt.Return Versprechen innerhalb Observable

removeTeam(key: string) { 
    const dataToRemove = {}; 
    dataToRemove[`teams/${key}`] = null; 

    this.findMembersInTeam(key).subscribe(members => { 
     members.forEach(member => { 
     dataToRemove[`members/${member}/teams/${key}`] = null; 
     }); 

     this.sdkDB.update(dataToRemove); 
    }); 
    } 

Was dies tut, ist im Grunde zu entfernen/Team/und auch, für jedes Mitglied im Team, um das Team, so entfernen/Mitglieder // Teams /.

Was ich tue, ist die Liste der Mitglieder in einem Team abrufen, und da dies ein beobachtbar ist, innerhalb der abonniere ich komponieren die „Abfrage“ und führen Sie es mit this.sdkDB.update(dataToRemove)

Diese letzte Methode gibt ein Versprechen, und das ist, was ich als Ergebnis der Methode removeTeam zurückgeben möchte, gibt es eine Möglichkeit, das zu tun?

Dank

+0

Wie nennt man 'removeTeam'? und was machst du damit? –

Antwort

0

Try this:

import 'rxjs/add/operator/toPromise'; 

// ... 

removeTeam(key: string) { 
    const dataToRemove = {}; 
    dataToRemove[`teams/${key}`] = null; 
    return this.findMembersInTeam(key) 
       .toPromise() 
       .then(members => { 
        members.forEach(member => { 
         dataToRemove[`members/${member}/teams/${key}`] = null; 
        }); 
        return this.sdkDB.update(dataToRemove); 
       }); 
} 
+0

Wenn 'sdkDB' ein Observable zurückgibt, funktioniert das nicht. – Lansana

+0

Ich habe die Antwort aktualisiert – Faly

+0

sdkDB gibt ein Versprechen zurück, aber das funktioniert auch nicht; Ich habe ein .do nach dem .findMembersInTeam (key) verwendet, um die zurückgegebenen Daten zu console.log zu schreiben und es funktioniert, aber die .then() wird nicht ausgeführt – David

3

IF sdkDB kehrt ein beobachtbares, importieren rxjs/add/operator/mergeMap und flatMap oder mergeMap verwenden (flatMap ist nur ein Alias ​​von mergeMap) statt subscribe.

Dies kombiniert Ihre beobachtbaren Streams.

removeTeam(key: string) { 
    const dataToRemove = {}; 
    dataToRemove[`teams/${key}`] = null; 

    return this.findMembersInTeam(key) 
     .flatMap(members => { 
      members.forEach(member => { 
       dataToRemove[`members/${member}/teams/${key}`] = null; 
      }); 

      return this.sdkDB.update(dataToRemove); 
     }) 
     .toPromise(); 
    } 
+0

sdkDB.update gibt ein Versprechen zurück, kein beobachtbares – David

+1

@David In RxJS 5 ist es egal und Observables und Promises werden auf die gleiche Weise behandelt. Statt 'flatMap' benutzen Sie' mergeMap' ('flatMap' ist nur ein Alias) und abonnieren Sie später irgendwo in' removeTeam' oder geben Sie das Observable zurück. – martin

+0

aber ich möchte kein Observable zurückgeben, ich möchte ein Versprechen abgeben. Meine Schnittstelle hat eine addTeam sowie die removeTeam, und addTeam gibt eine Promise zurück, also möchte ich die Dinge konsistent halten und ein Versprechen auch in removeTeam zurückgeben. – David

Verwandte Themen