2017-08-14 56 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 –