Как предотвратить зависание React Native на обещаниях es6? - PullRequest
1 голос
/ 23 июня 2019

Я работаю с Realm DB.Когда я работаю с обратными вызовами и обещаниями из собственного модуля (add_listener, как из результатов, так и из подписок), мой пользовательский интерфейс зависает, и, даже если я вижу журналы с консоли js, все делается правильно, пользовательский интерфейс обновляется только после взаимодействия (более конкретно, когдаЯ нажимаю на экран)

Я заметил два разных поведения:

1) Когда я добавляю слушателя к объекту или объекту результатов, ИНОСТРАННЫЙ setState в обратном вызове слушателя, он запускается, нопроблема выше

2) Когда я жду обещания проверить, завершена ли подписка на определенный запрос, мне нужно нажать даже, чтобы увидеть, как продолжаются журналы.В этом случае я использую этот код (CODE1)

Для первой проблемы, которую я попытался:

1) Включить setState в обратный вызов в setTimeout, setImmediate - NOT WORKING

Вы можете прочитать о первой проблеме здесь

Пользовательский интерфейс не обновляется до тех пор, пока не коснитесь экрана, когда setState вызывается внутри обратного вызова слушателя области

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

    });

  }

Спасибо за помощь

1 Ответ

0 голосов
/ 24 июня 2019

Для задачи (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), но я уверен в этом

UPDATE

Решает также (1)

...