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

时间:2019-06-23 16:26:07

标签: javascript react-native realm es6-promise

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

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

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

2)当我等待答应检查对某个查询的预订是否完成时,我甚至需要点击以查看日志是否继续。在这种情况下,我使用此代码(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);
        }
      })

    });

  }

要寻求帮助

1 个答案:

答案 0 :(得分:0)

对于问题(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)