2017-10-05 11 views
1

反応するネイティブモバイルアプリケーションの開発中にこのエラーが発生しました。未定義はオブジェクトではありません(Promise .thenを評価する)

fetchDB関数は、エラー

未定義の赤色画面をレンダリング

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

.then()

がオブジェクトではない使用によって返さ約束から値をフェッチ約束

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

が返され

+0

'AsyncStorage.getItem'は非同期ですか?とにかく、コールバック関数内の戻り値は、あなたが 'fetchDB'関数から何かを返すことを意味するわけではありません...あなたは2つの問題を持っています...非同期コードを理解し、関数が実際には何も返しません...単純に 'Return AsyncStorage.getItem(key);' –

答えて

1

1) promise関数を明示的に返す必要があります。状況がキャッチコールバック内で処理することができ失敗:

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に自然を約束:最後.catchfetchDB約束からスローされたすべてのエラーを処理

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

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

+0

メソッドが確実に約束を返すので、Point(1)は完全に機能します。 Tq –

+0

あなたは大歓迎です! – dhilt

関連する問題