2016-06-17 2 views
1

ich verwende ionic + firebase, um eine Chat-Anwendung zu erstellen. Wenn eine Nachricht zum Telefon kommt, kommt sie mit uid, ich muss den Benutzernamen mit dieser UID holen, um dem Benutzer die Nachricht zu zeigen (Benutzername: Nachrichtentext). Aber das Abrufen des Benutzernamens von Firebase benötigt Zeit (und Bandbreite). Also muss ich diese Benutzer-Paare zwischenspeichern. System Ich schrieb Werke auf der Website und Android-Emulator. Aber wenn ich versuche, es auf meinem Android-Handy zu installieren, funktioniert es nicht. Hier ist der Code.Warum funktioniert das JavaScript-Versprechen nicht auf Android 4.4 mit dem Ionic Framework?

var uNameCache = {}; 
    function getUsername(uid) { 
    toastr.info("Fetching username for "+uid); 
    return new Promise(function(resolve, reject) { 
     toastr.info("Trying to fetch with a promise");//this is not showing on an actual android phone 
     if(uNameCache[uid]){ 
     //get from cache 
     toastr.info("get from cache"); 
     resolve(uNameCache[uid]); 
     }else{ 
     //get from firebase 
     toastr.info("get from firebase"); 
     firebase.database().ref('users').child(uid).once('value').then(function(snapshot) { 
      var username = snapshot.val().username; 
      uNameCache[uid] = username; 
      resolve(username); 
     }); 
     } 
     //resolve("High_Admin");  
     // reject ("Error!"); 
    }); 
    }; 

und hier ist der Code, der diese

firebase.database().ref('channel_messages').child(channelid).on('child_added',function(snapshot){ 
    var msg = snapshot.val(); 
    toastr.info("message get"); 
    getUsername(msg.uid).then(function(username){ 
     toastr.info("username fetched!"); 
     msg.username = username; 
     $scope.messages.push(msg); 
     //todo if scrollplace down scroll down, else dont touch player is reading old messages. 
     $ionicScrollDelegate.$getByHandle('mainScroll').scrollBottom(); 
     $scope.$apply(); 
    }); 
    }); 

bearbeiten verwendet: Ich bin immer noch nicht sicher, warum dies passiert ist, aber ich finde, eine Verknüpfung von nur Versprechen zu löschen und es auf Feuerbasis Ereignis handelt.

+0

Kann ich, warum Sie die Javascript-Versprechen verwenden und nicht die Winkel Versprechen ? Und welche Version von Android läuft auf Ihrem Gerät? – Dexter

+0

Ich wusste nicht, dass es Angular Promise gab, sicher wird das aussehen. Und ich habe diesen Code auf Android kitkat getestet (nicht wirklich sicher, welche Version genau) Danke für Infos. Habt einen schönen Tag ^^ – seyahdoo

Antwort

0

Ich denke, dass dies aufgrund der Tatsache sein kann, dass ältere Versionen von Android JavaScript-Versprechen nicht unterstützt. Sie können solche Dinge auf this website überprüfen.

Der große Unterschied ist, dass das Angular Promise $q genannt wird, aber abgesehen davon werden Sie nicht viele Unterschiede bemerken. Sie können viel mehr Informationen darüber in der finden.

In Ihrem Code, müssen Sie $q als Abhängigkeit und Veränderung injizieren:

return new Promise(function(resolve, reject) { 

Um dies:

return $q(function(resolve, reject) { 
Verwandte Themen