2016-09-03 8 views
-3

私は何らかの認証を行う反応ネイティブのアプリケーションを持っています。Promise return undefined AsyncStorage

トークンが有効期限切れでないかどうかをチェックする次のコードがあります。

export const isLogged =() => { 

    AsyncStorage.getItem('@token') 
    .then(token => { 

     if (typeof token !== 'undefined') { 

     if (tokenExpired(token)) { 

      return false 

     } 

     return true 

     } 

     return false 

    }) 
    .catch(error => { 

     return false 

    }) 

} 

しかし、私のコードで私がない場合:

let isUserLogged = isLogged() 
console.log(isUserLogged) // -> returns undefined, but should return true because the token is there and its not expired. 

誰が、なぜそのこのように、私が何か間違ったことをいくつかのアイデアをやっていますか?

+0

あなたは別の 'then'ステージを連鎖させてそこにチェックインする必要があります。 – Redu

答えて

4

非同期的にしか使用できない結果を同期的に取得しようとしています。

は、このようにコードを変更し

  1. は、この呼び出しの前にreturnを追加します。約束

  2. 使用この約束で:

    AsyncStorage.getItem('@token') 
    

    このごisLogged関数の戻り値の何かを行いますあなたのメインコード:

    isLogged().then(isUserLogged => { 
        console.log(isUserLogged); 
    }); 
    

約束を(あなたがそれを返すとき、つまり)を返すisLoggedあなたの関数は、chainingの一例であるという事実。

1

isLogged関数は非同期関数です。すなわち、関数の実行の正確な時点では利用できない可能性があるが時間的に遅れた値で動作します。

すでにここに約束上で動作しているので、あなたは自分のAsyncStorage約束チェーンの結果を返すことができ、その後、このようisLogged()機能を呼び出すときに、追加のハンドラをアタッチ:

// inside your isLogged() function 
return AsyncStorage.getItem('@token') 
    .then(...) 
    ... rest of your code unchanged ... 

// when invoking isLogged() 
isLogged().then((isLogged) => { 
    console.log("is user logged: ", isLogged); 
}); 

ます。また、詳細をお読みくださいJavaScriptのPromises

+0

ありがとう、これを同期させる方法はありますか?関数から直接リターンしますか? – Hiero

+0

いいえ、[documentation](https://facebook.github.io/react-native/docs/asyncstorage.html)は、AsyncStoreが(名前が既に示唆しているように)非同期ストアであると述べています。これを同期させたい場合は、置き換えを見つけなければなりません(しかし、もしあれば私にはわかりません)。 – mdziekon