2017-10-05 9 views
1

반응 네이티브 모바일 응용 프로그램을 개발하는 중에이 오류가 발생합니다.undefined가 개체가 아닙니다 (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' 함수에서 반환하는 것을 의미하지는 않습니다 ... 그래서 두 가지 문제가 있습니다 ... 비동기 코드를 이해하고 함수가 실제로 아무 것도 반환하지 않는다는 것을 이해합니다 ... 간단하게'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) 심지어 말을한다는 돈 마지막으로 .catchfetchDB 약속에서 던진 어떤 오류를 처리

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

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

그건 '는 t 시도 - 캐치 인해를 약속 자연을 ES6해야합니다.

+0

메소드가 확실한 약속을 되 돌리므로 Point (1)은 완벽하게 작동합니다. Tq –

+0

당신은 오신 것을 환영합니다! – dhilt