Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript承诺不能在使用Ionic框架的Android 4.4上运行?_Javascript_Android_Ionic Framework - Fatal编程技术网

为什么JavaScript承诺不能在使用Ionic框架的Android 4.4上运行?

为什么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) {

我正在使用ionic+firebase制作聊天应用程序。当手机收到一条带有uid的消息时,我需要获取带有该uid的用户名以向用户显示消息(用户名:messagetext)。但直接从firebase获取用户名需要时间(和带宽)。所以我需要缓存这些uid:username对。我写的系统在网站和android模拟器上运行。但是,当我试图在我的android手机上安装它时,它不起作用。这是代码

  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上测试了这段代码(不确定到底是哪个版本),谢谢你提供的信息。祝你今天愉快^^