首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何防止React Native对es6承诺的破坏?

如何防止React Native对es6承诺的破坏?
EN

Stack Overflow用户
提问于 2019-06-24 00:26:07
回答 1查看 1K关注 0票数 2

我正在使用Realm DB。当我处理来自本机模块的回调和承诺(add_listener,无论是来自结果还是订阅)时,我的UI停滞了,即使我可以从js控制台看到正确完成操作的日志,UI也只有在交互之后才会更新(更具体地说,当我点击屏幕时)。

我注意到两种不同的行为:

1)当我在对象或结果对象上添加侦听器时,有时侦听器回调中的setState会触发它,但会出现上面的问题

2)当我等待promise检查某个查询的订阅是否完成时,我需要点击even for see the logs on。在本例中,我使用以下代码(CODE1)

对于我尝试的第一个问题:

1)在setTimeout中的回调中包含setState,setImmediate -不工作

你可以在这里读到第一个问题

UI doesn't update until tap on the screen when setState is called inside a realm listener callback

https://github.com/realm/realm-js/issues/2371

也许是相关的:

React Native Fetch does not render response until after clicking screen

第二个问题是一个新问题,所以我正在调查

代码1

susbscribeAndSyncTo = async (object) => {


    // Aggiungo dei listeners per controllare quando la sincronizzazione sarà completata
    console.log("Recupero i dati dal server")
    var subscription = object.subscribe()

    return new Promise((resolve, reject) => {
      console.log("Imposto un listener sulla sottoscrizione")
      subscription.addListener((subscription, state) => {
        console.log("La sottoscrizione è in fase", state)
        if (this.checkSubscriptionState(state, 'user_data')) {
          console.log("La sincronizzazione è completa. rimuovo i listener dalla sottoscrizione e ritorno la promessa", state)
          subscription.removeAllListeners()
          resolve(true);
        }
      })

    });

  }

塔克斯寻求帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-24 11:16:39

对于问题(2),我这样解决

susbscribeAndSyncTo = async (object) => {


// Aggiungo dei listeners per controllare quando la sincronizzazione sarà completata
console.log("Recupero i dati dal server")
var subscription = object.subscribe()

return new Promise((resolve, reject) => {
  console.log("Imposto un listener sulla sottoscrizione")
  subscription.addListener((subscription, state) => {
    console.log("La sottoscrizione è in fase", state)
    if (this.checkSubscriptionState(state, 'user_data')) {
      console.log("La sincronizzazione è completa. rimuovo i listener dalla sottoscrizione e ritorno la promessa", state)
      subscription.removeAllListeners()
      setTimeout(() => null, 0);  // THIS IS THE WORKAROUND
      resolve(true);
    }
  })

});

}

多亏了这篇文章我做到了:

https://github.com/facebook/react-native/issues/6679

我将检查此解决方法是否也解决了(1),但我对此很有信心

更新

它还解决了(1)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56725797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档