如何防止 React Native 卡在 es6 Promises 上?
How to prevent React Native from stucking on es6 Promises?
我正在使用 Realm DB。当我使用来自本机模块(add_listener,来自结果或订阅)的回调和承诺时,我的 UI 卡住了,即使我可以从 js 控制台看到正确完成的日志,UI 仅在交互后更新(更具体地说,当我点击屏幕时)
我注意到两种不同的行为:
1) 当我在对象或结果对象上添加侦听器时,有时会触发侦听器回调中的 setState,但会出现上述问题
2) 当我 await promise 检查某个查询的订阅是否完成时,我需要点击 even 才能看到日志继续。在这种情况下,我使用此代码 (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
可能相关:
第二个问题是一个新问题,所以我正在调查
代码 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);
}
})
});
}
感谢这个 post:
https://github.com/facebook/react-native/issues/6679
我会检查此解决方法是否也解决了 (1),但我对此很有信心
更新
它也解决了 (1)
我正在使用 Realm DB。当我使用来自本机模块(add_listener,来自结果或订阅)的回调和承诺时,我的 UI 卡住了,即使我可以从 js 控制台看到正确完成的日志,UI 仅在交互后更新(更具体地说,当我点击屏幕时)
我注意到两种不同的行为:
1) 当我在对象或结果对象上添加侦听器时,有时会触发侦听器回调中的 setState,但会出现上述问题
2) 当我 await promise 检查某个查询的订阅是否完成时,我需要点击 even 才能看到日志继续。在这种情况下,我使用此代码 (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
可能相关:
第二个问题是一个新问题,所以我正在调查
代码 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);
}
})
});
}
感谢这个 post:
https://github.com/facebook/react-native/issues/6679
我会检查此解决方法是否也解决了 (1),但我对此很有信心
更新
它也解决了 (1)