2016-09-03 5 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

다른 '다음'단계를 연결하고 거기에서 수표를해야합니다. – Redu

답변

4

비동기 적으로 만 사용할 수있는 결과를 동 기적으로 가져 오려고합니다.

은 다음과 같이 코드를 변경

:

  1. 이 호출 전에 return 추가 : 약속

  2. 사용이 약속의 :

    AsyncStorage.getItem('@token') 
    

    이 당신의 isLogged 함수 반환 뭔가를 만들 것입니다 귀하의 주 코드 :

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

약속을 (당신이 그것을 반환 할 때, 즉) 반환 isLogged 함수는, chaining의 예입니다 사실.

1

isLogged 함수는 비동기 함수입니다. 즉, 함수 실행의 정확한 순간에 사용할 수 없지만 시간이 지연된 값에 대해 작동합니다. 이 같은 isLogged() 함수를 호출 할 때

이미 여기 약속에서 작동하기 때문에, 당신이 당신 AsyncStorage 약속 체인의 결과를 반환 한 다음 추가 핸들러를 첨부 할 수 있습니다 :

// 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