[英]How to prevent React Native from stucking on es6 Promises?
我正在使用Realm DB。 當我處理來自本機模塊(add_listener,既來自結果還是訂閱)的回調和promise時,我的UI卡住了,即使我可以從js控制台看到日志,說明事情已正確完成,該UI也僅在交互后才更新(更具體地說,我在屏幕上點擊)
我注意到兩種不同的行為:
1)當我在對象或結果對象上添加偵聽器時,有時會觸發偵聽器回調中的setState,但會發生上述問題
2)當我等待檢查某個查詢的預訂是否完成時,我什至需要點擊以查看日志繼續。 在這種情況下,我使用此代碼(CODE1)
對於第一個問題,我嘗試了:
1)將setState包含在setTimeout,setImmediate的回調中-不起作用
您可以在這里閱讀有關第一個問題的信息
在領域偵聽器回調中調用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),但我對此有信心
更新
它也解決(1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.