Angular 4奇怪的错误:当-not-显示消息toast

时间:2017-08-01 17:45:32

标签: javascript angular typescript ionic-framework

这是我整个编程生涯中最奇怪的错误。我一直在努力解决这个问题,但我找不到这段代码中发生的事情。它似乎没有任何意义。

我正在使用以下工具:

  • Ionic 3
  • Angular 4
  • Typescript / ES6

我正在尝试一种方法,“assignChat(user)”,它为用户分配聊天。它必须使用几个API,地理定位......实际上,这是一个很重要的方法。这就是为什么我把它分成两部分由promises连接,并在之后使用它们,所以我的方法看起来非常像这样:

    assignChat(user){
  const getLocationName = () => {
    return new Promise((resolve,reject) => {
      // 30 lines of code
    });
  }
  const assignOrCreateChat= (area) => {
    return new Promise((resolve,reject) => {
      // 40 lines of code
    });
  }
  const getLocationName = () => {
    return new Promise((resolve,reject) => {
      // 30 lines of code
    });
  }


   // then I use the inner functions here and write an extra 60-70 lines of code  
}

确定!这工作很整洁。经过几次测试后,这个算法没有太多问题,虽然很重,需要大约0.5秒才能正确执行,完成查询并显示结果。

事情是......我有一些吐司显示一些信息,比如你所在的位置。我想删除它们,并在内部函数getLocationName()中启动它。这是我想谈你的代码:

const getLocationName = () => {
        return new Promise( (resolve, reject) => {
            const ADDRESS_LEVEL = 2; 
            this.reverseGeocode(ADDRESS_LEVEL).then( address => {
      --->      this.toastify("You have been located at: "+address, 1500);
                let query = new Parse.Query("PoliticalArea");
                // more code

我用箭头标记的线是给我带来问题的线。 我的意思是,你可能认为代码因为线路而失败,但它完全是对面的!如果我删除该行,算法会突然停止工作并且无法显示任何结果

“toastify”方法是我为自己展示祝酒词的快捷方式。实际上它运作良好!这是实施:

   toastify(message, duration){       
      this.toastCtrl.create({
             message: message,
             duration: duration
      }).present();
   }

不喜欢最危险的方法。嗯,实际上,如果没有它,代码似乎无法运行。如果我评论该行,或者删除它,我从来没有从我之前展示的大算法中得到任何结果或任何错误。虽然API连接器没有超时,但我已经抓住了所有可能的异常,但是每次它都没有显示吐司时就会卡住它。

我只是不明白发生了什么。看来,Angular团队应该调查一件非常严肃的事情,我非常诚实。

知道那里会出现什么样的黑魔法?

更新:

进一步的信息:当我浏览“bugged”视图(没有toastify行,因此不显示聊天结果)时,按照例子,点击另一个聊天(将视图推入导航控制器),它以某种方式开始显示我预期的聊天结果。当我从navCtrl弹出新视图并返回页面时,预期结果现在可见。

角度表有问题吗?

1 个答案:

答案 0 :(得分:1)

好的,解决方案并不明显。

似乎在任务完成之前渲染了视图。这是一项艰巨的任务,也许这就是为什么Angular无法正常工作的原因。尝试在构造函数和ionViewDidEnter()中执行它,但没有任何工作。

我的最终解决方案是通过ApplicationRef强制组件重新渲染,使用方法死角的.tick()方法。

解决了这一切!