为什么JavaScript承诺不能在使用Ionic框架的Android 4.4上运行?
我正在使用ionic+firebase制作聊天应用程序。当手机收到一条带有uid的消息时,我需要获取带有该uid的用户名以向用户显示消息(用户名:messagetext)。但直接从firebase获取用户名需要时间(和带宽)。所以我需要缓存这些uid:username对。我写的系统在网站和android模拟器上运行。但是,当我试图在我的android手机上安装它时,它不起作用。这是代码为什么JavaScript承诺不能在使用Ionic框架的Android 4.4上运行?,javascript,android,ionic-framework,Javascript,Android,Ionic Framework,我正在使用ionic+firebase制作聊天应用程序。当手机收到一条带有uid的消息时,我需要获取带有该uid的用户名以向用户显示消息(用户名:messagetext)。但直接从firebase获取用户名需要时间(和带宽)。所以我需要缓存这些uid:username对。我写的系统在网站和android模拟器上运行。但是,当我试图在我的android手机上安装它时,它不起作用。这是代码 var uNameCache = {}; function getUsername(uid) {
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!");
});
};
下面是使用这个的代码
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();
});
});
编辑:我仍然不知道为什么会发生这种情况,但我找到了一个捷径,只需删除承诺并在firebase事件中处理它。我认为这可能是因为旧版本的Android不支持JavaScript承诺。你可以检查这些东西 最大的区别是,角度承诺被称为
$q
,但除此之外,您不会注意到许多差异。你可以在网站上找到更多关于它的信息
在代码中,您需要将$q
作为依赖项注入并更改:
return new Promise(function(resolve, reject) {
为此:
return $q(function(resolve, reject) {
我认为这可能是因为旧版本的Android不支持JavaScript承诺。你可以检查这些东西 最大的区别是,角度承诺被称为
$q
,但除此之外,您不会注意到许多差异。你可以在网站上找到更多关于它的信息
在代码中,您需要将$q
作为依赖项注入并更改:
return new Promise(function(resolve, reject) {
为此:
return $q(function(resolve, reject) {
我可以解释一下为什么您使用Javascript承诺而不是角度承诺吗?你的设备运行的是哪一个版本的Android?我不知道有这样的承诺,我一定会看看。我在android kitkat上测试了这段代码(不确定到底是哪个版本),谢谢你提供的信息。祝你有美好的一天^^我可以用一下你为什么使用Javascript承诺而不是Angular承诺吗?你的设备运行的是哪一个版本的Android?我不知道有这样的承诺,我一定会看看。我在android kitkat上测试了这段代码(不确定到底是哪个版本),谢谢你提供的信息。祝你今天愉快^^