2017-08-14 72 views
0

我正面临从原生反应函数返回值的问题。这是一个全球性的功能,不在任何课堂内。我将返回值分配给var。但值总是未定义的。以下是函数代码片断。函数返回值未定义反应原生

var userLoggedIn= (function(){ 
    AsyncStorage.getItem("isLoggedIn").then((login) => { 
     var loggedIn = login; 
     console.log("Logged In " + loggedIn); // getting correct value 
     return loggedIn; 
    }).done(); 
})(); 

console.log("userLoggedIn" + userLoggedIn); // this is undefined 

const IntialScreen = AppNavigator(loggedIn); 导出默认IntialScreen;

请检查我在这里做错了什么。我是新来的原始和JavaScript的反应,所以我可能做错了什么或我不知道一些JavaScript的概念

+2

可能的重复[如何从异步调用返回响应?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-呼叫) –

回答

0

var userLoggedIn = false;

(函数(){

AsyncStorage.getItem("isLoggedIn").then((login) => { 
    var loggedIn = login; 
    console.log("Logged In " + loggedIn); // getting correct value 
}).done(function() { 
    userLoggedIn= loggedIn; 
}); 

})();

希望这有助于

+0

OP想从函数返回 –

+0

我认为@paras需要变量userLoggedIn才有用户登录状态。 var userLoggedIn = false; (函数(){ AsyncStorage.getItem( “isLoggedIn”),那么((登录)=> { 变种的loggedIn =登录; 的console.log( “记录在” +的loggedIn); //获得正确的值()函数(){ userLoggedIn = loggedIn; }); })(); – shinuq

+0

是正确的,但如果该变量在函数内部,那么它是没有用的。当它的值以异步方式更新时,你不能在外部使用它 –

1

你应该在处理异步调用时返回一个承诺。在您的case.userLoggedIn因为它得到,而不必等待该AsyncStorage.get项目响应()

var userLoggedIn= (function(){ 
     return new Promise((resolve, reject) => { 
     AsyncStorage.getItem("isLoggedIn").then((login) => { 
      var loggedIn = login; 
      console.log("Logged In " + loggedIn); // getting correct value 
      resolve(loggedIn); 
     }).done(); 
     }) 

})(); 

更新基于澄清OP

export default function(callback){ 
    userLoggedIn.then((loggedIn)=>{ 
    //do whatever you want to do with it 
    const IntialScreen = AppNavigator(loggedIn); 
    callback(IntialScreen); 

    }) 
}; 

一些组件返回执行未定义

import InitialScreen from './somefile'; 
    InitialScreen((loginData)=>{ 
    //loginData will have what you wanted to export 
    }); 
+0

我想将登录值传递给堆栈导航器 const IntialScreen = AppNavigator('login value'); 导出默认IntialScreen; 我该怎么做? –

+0

解析(loggedIn)是做什么的? –

+0

我会尽力解释它。当处理异步调用和更新变量时,可能无法直接使用该变量,因为它的值更新是无限期的,可能随时发生。因此您需要解决或以简单的方式提供此异步调用已完成其执行的功能。最终的结果可能是成功还是失败。成功受到解决(val)和拒绝(val)失败的影响。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise http://www.mattgreer。org/articles/promises-in-wicked-detail/ 这里有一些参考文献 @ParasWatts –

相关问题