【问题标题】:How to prevent React Native from stucking on es6 Promises?如何防止 React Native 卡在 es6 Promise 上?
【发布时间】:2019-06-23 16:26:07
【问题描述】:

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

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

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

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

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

1) 在 setTimeout 的回调中包含 setState,setImmediate - NOT WORKING

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

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

    });

  }

谢谢你的帮助

【问题讨论】:

  • 我在您的代码示例中没有看到任何 await。你确定这是正确的代码吗?
  • @SerShubham 这是我等待的功能
  • 您是否按照您链接到的每秒(可能相关)主题检查了应用程序未处于调试模式吗?
  • 对于 (1) 是的。它不起作用......对于(2)我会立即检查。

标签: javascript react-native realm es6-promise


【解决方案1】:

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

【讨论】:

  • 该死,对我不起作用。还有其他与此相关的提示吗?
猜你喜欢
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2016-03-20
  • 2020-01-23
  • 2017-05-24
  • 2020-01-18
相关资源
最近更新 更多