2017-01-27 3 views
1

Ich habe den folgenden CodeTyposkript Rückgabeobjekt nach Feuerbasis Login

login = (email: string, senha: string): { nome: string, genero: string, foto: string;} => { 
    this.fireAuth.signInWithEmailAndPassword(email, senha).then(res => { 
     firebase.database().ref('Usuarios/' + res.uid).once('value', snapshot => { 
      return { 
       nome: snapshot.val().nome, 
       genero: snapshot.val().genero, 
       foto: snapshot.val().avatar 
      }; 
     }); 
    }); 
} 

und ich brauche es ein Objekt zurückgeben, nachdem ich in Feuerbasis anmelden und dann meine Informationen erhalten, aber es wirft einen Fehler, dass ich etwas zurückgeben muss wenn der Funktionstyp nicht 'void' oder 'any' ist, aber ich gebe ein Objekt wie angegeben zurück.

Was kann ich tun?

Antwort

2

Sie verwenden falsch, das Konzept der async und Versprechungen. Es gibt ein paar Optionen, um es zu lösen.

1 - Sie können das Versprechen zurückgeben und den Anrufer auflösen lassen.

login = (email: string, senha: string): Promise<{nome: string, genero: string, foto: string}> => { 
    return new Promise<{nome: string, genero: string, foto: string}>((resolver, rejeitar) => { 
     this.fireAuth.signInWithEmailAndPassword(email, senha).then(res => { 
      firebase.database().ref('Usuarios/' + res.uid).once('value', snapshot => { 
       resolver({ 
        nome: snapshot.val().nome, 
        genero: snapshot.val().genero, 
        foto: snapshot.val().avatar 
       }); 
      }); 
     }); 
    }); 
} 

2 - Sie können einen Rückruf in der Login-Funktion senden und auszuführen, wenn das Versprechen

login = (email: string, senha: string, loginCallback: (nome: string, genero: string, foto: string) => any) => { 
    this.fireAuth.signInWithEmailAndPassword(email, senha).then(res => { 
     firebase.database().ref('Usuarios/' + res.uid).once('value', snapshot => { 
      loginCallback({ 
       nome: snapshot.val().nome, 
       genero: snapshot.val().genero, 
       foto: snapshot.val().avatar 
      }); 
     }); 
    }); 
} 

Bearbeiten ausgeführt wird: überprüfte ich die Firebase Dokumentation (https://firebase.google.com/docs/database/web/read-and-write#read_data_once). Es gibt auch einen zweiten Fehler.

firebase.database().ref('Usuarios/' + res.uid).once('value', snapshot => { 

sollte sein: Ihre Lösung

firebase.database().ref('Usuarios/' + res.uid).once('value').then(snapshot => { 
+0

werden versuchen, Sie bald informieren, wenn dies funktioniert. Der Umgang mit Verspätungen unterbricht meine App beim Login, aber ich denke, es sind nur Firebase-Versprechen, andere Komponeten versprechen nichts dagegen (weiß nicht warum, aber es gibt eine Menge Probleme mit GitHub). –

+0

Es ist, weil Sie wie Sync-Programmierung verwenden. Wenn Sie Async verwenden, müssen Sie Callbacks verwenden, um die Antwort eines Vorgangs zu erhalten. Versprechen == Async –

+0

Es gibt keine Möglichkeit, von Versprechen wegzulaufen. Du musst dich umarmen, haha. Ich bin durch dasselbe gegangen! –

0

Ihre innere Funktion innerhalb once gibt ein Objekt zurück. Nicht die Funktion, die der Anmeldung zugewiesen ist. Die äußerste Funktion sollte ein Versprechen abgeben.

Versuchen:

login = (email: string, senha: string): Promise<any> => { 
    //return here as well 
    return this.fireAuth.signInWithEmailAndPassword(email, senha).then(res => { 
     //return the database call 
     return firebase.database().ref('Usuarios/' + res.uid).once('value', snapshot => { 
      return { 
       nome: snapshot.val().nome, 
       genero: snapshot.val().genero, 
       foto: snapshot.val().avatar 
      }; 
     }); 
    }); 
}