2017-10-05 2 views
1

Je reçois cette erreur en développant une application mobile native.undefined n'est pas un objet (évaluation Promise .then)

fonction fetchDB retourne une promesse

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

aller chercher la valeur de la promesse de retour à l'aide .then()

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

son rendu l'écran rouge avec l'erreur

non définie est pas un objet

+0

'AsyncStorage.getItem' est asynchrone? Quoi qu'il en soit, une valeur de retour dans une fonction de rappel ne signifie pas que vous retournez quelque chose de la fonction 'fetchDB' ... donc vous avez deux problèmes ... comprendre le code asynchrone, et comprendre que votre fonction ne retourne rien de toute façon ... essayez simplement 'return AsyncStorage.getItem (key);' –

Répondre

1

1) Vous devez renvoyer la fonction de promesse explicitement. la situation Fail pourrait être traitée dans le rappel de capture:

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

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

2) Point (1) ne fonctionne que si AsyncStorage.getItem retourne vraiment promesse. Si ce n'est pas vrai, alors vous devez mettre à jour la méthode AsyncStorage.getItem pour être promis. Si vous avez pas accès à cette méthode ou ne voulez pas toucher, la question pourrait se faire aussi par la mise à jour fonction fetchDB d'une manière comme:

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) Je dirais même que vous ne « t besoin try-catch en raison de la nature des promesses ES6:

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

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

Cette dernière .catch gère toute erreur à partir fetchDB Promise.

+0

Comme la méthode retourne la promesse sans échec, Point (1) fonctionne parfaitement. Tq –

+0

Vous êtes les bienvenus! – dhilt