如何防止React Native粘在es6 Promises上?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (4)

我正在使用Realm DB。当我处理来自本机模块的回调和promise(add_listener,来自结果或订阅)时,我的UI卡住了,即使我可以看到来自js控制台的日志正确完成的日志,UI也会在交互后更新(更具体地说,我点击屏幕)

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

1)当我在一个对象或一个结果对象上添加一个监听器时,在侦听器回调中触发了setState,但是上面的问题发生了

2)当我等待承诺检查某个查询的订阅是否完成时,我需要点击甚至查看日志继续。在这种情况下,我使用此代码(CODE1)

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

1)在setTimeout中设置回调中的setState,setImmediate - NOT WORKING

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

在领域侦听器回调中调用setState时,直到点击屏幕才会更新UI

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

也许相关:

在单击屏幕之后,React Native Fetch不会呈现响应

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

代码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);
        }
      })

    });

  }

多克斯寻求帮助

提问于
用户回答回答于

对于问题(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),但我对此有信心

扫码关注云+社区

领取腾讯云代金券