2017-10-05 148 views
1

在開發反應原生移動應用程序時,我得到這個錯誤。undefined不是一個對象(評估Promise。)

fetchDB功能將使用返回一個承諾

fetchDB(key) { 
    try { 
     AsyncStorage.getItem(key, result => { 
     return result; 
     }); 
    } catch (error) { 
     console.log(error); 
    } 
    } 
} 

從返回承諾取值.then()

getUserName =() => { 
    var user = Storage.fetchDB("username"); 
    user.then(res => { 
     alert(res); 
    }); 
    }; 

其呈現紅屏,錯誤

不確定是不是一個對象

+0

'AsyncStorage.getItem'是異步的嗎?無論如何,回調函數中的返回值並不意味着你從'fetchDB'函數返回了一些東西......所以你有兩個問題......理解異步代碼,並且理解你的函數實際上並不會返回任何東西...嘗試簡單地'返回AsyncStorage.getItem(key);' –

回答

1

1)你需要明確回報承諾的功能。失敗情況可能捕捉回調中進行處理:

fetchDB(key) { 
return AsyncStorage.getItem(key).catch(error => console.log(error)); 
} 

fetchDB("username").then(res => alert(res)); 

2)點(1)只當AsyncStorage.getItem真的返回承諾。如果不是這樣,那麼您需要更新AsyncStorage.getItem方法爲基於承諾。如果你還沒有訪問該方法或不想去觸摸它,這個問題可能也做了通過類似的方式更新fetchDB功能:

fetchDB(key) { 
    return new Promise((resolve, reject) => { 
    try { 
     AsyncStorage.getItem(key, resolve); 
    } 
    catch (error) { 
     reject(error); 
    } 
    }) 
} 

fetchDB("username") 
    .then(res => alert(res)) 
    .catch(error => console.log(error)); 

3)我甚至會說,你不「T需要的try-catch由於ES6承諾性質:

fetchDB(key) { 
    return new Promise((resolve, reject) => 
    AsyncStorage.getItem(key, resolve) 
) 
} 

fetchDB("username") 
    .then(res => alert(res)) 
    .catch(error => console.log(error)); 

這最後.catch處理來自fetchDB承諾引發的任何錯誤。

+0

由於方法返回承諾沒有失敗,,點(1)完美地工作。 Tq –

+0

歡迎您! – dhilt

相關問題