2013-11-25 25 views
0

首先,我的代碼如下。我的主要問題是我無法在調用之後或調用ajax之後將結果數據返回到invokeConfigFile函數之外。無法從我的JavaScript函數獲取值

var invokeConfigFile = function() { 
    return $http.get('json/config.json'); 
}; 

var data = {} 

var getDataFromInvokedFile = function() { 
    invokeConfigFile().then(function(result) { 

    var current_env = result.data.current_environment, 
     list_env = result.data.environments; 

    angular.forEach(list_env, function(value, key) { 
     // retrive the config on the current environment 
     if(key === current_env) { 

      data = value; 
      return false; //let's stop if the condition are met 
     } 
    }); 
    console.log(data); // return data GOOD 
    return data; 


    }, function(result) { 

    if(result.status == 404) { 
     alert("Server config.js file not found."); 
     return false; 
    } 
    }); 
    console.log(data); // return data EMPTY 
}; 

var my_urls = getDataFromInvokedFile(); 

我想在這裏實現我從我的Ajax調用是invokeConfigFile(),我會那麼這個存儲對象得到的結果數據之後。

像這樣的事情

return { 
my_obj : getDataFromInvokedFile() 
} 
+0

的問題是,Ajax調用將是異步的。這意味着返回空的最終'console.log(data);'將在通話完成之前運行。您應該將其放在回調函數中,以確保設置值,或使Ajax調用同步。 – Nunners

+0

感謝Guffa和你的意見我得到了它的工作。但是對於最後一部分,我如何在'return {my_obj:getDataFromInvokedFile()}'中設置返回的數據呢? – user2720708

回答

2

由於AJAX調用是異步的,所以不能從函數返回數據。函數返回後,響應到達。

使用回調到達時處理數據:

function getDataFromInvokedFile(callback) { 
    invokeConfigFile().then(function(result) { 

    var current_env = result.data.current_environment, 
     list_env = result.data.environments; 

    angular.forEach(list_env, function(value, key) { 
     // retrive the config on the current environment 
     if(key === current_env) { 

      data = value; 
      return false; //let's stop if the condition are met 
     } 
    }); 
    callback(data); 


    }, function(result) { 

    if(result.status == 404) { 
     alert("Server config.js file not found."); 
     calback(false); 
    } 
    }); 
} 

用法:

getDataFromInvokedFile(function(data){ 
    // here you have the data 
}); 
+0

謝謝,它的工作原理。但是,我如何設置返回obj屬性中的數據。 E.G'getDataFromInvokedFile(function(data){data = data;});返回{my_data:data}'。所以,當我調用/調用文件時,它只是'my_invoked_file.my_data;' – user2720708

+0

@ user2720708:那裏情況相同,不能在調用getDataFromInvokedFile之後的代碼中使用數據,因爲該代碼在調用回調函數之前執行。在使用異步調用時,必須異步處理結果。數據存在之前無法返回數據。 – Guffa

+0

你能幫我做到同步嗎?我很難做這件事T_T – user2720708

0

我做出一些變化,使評論 「點擊這裏」

var getDataFromInvokedFile = function() { 
    invokeConfigFile().then(function(result) { 

    var current_env = result.data.current_environment, 
     list_env = result.data.environments; 

    angular.forEach(list_env, function(value, key) { 
     // retrive the config on the current environment 
     if(key === current_env) {  
      data = value; 
      return false; //let's stop if the condition are met 
     } 
    }); 
    console.log(data); // return data GOOD 
    return data; 

    }, function(result) { 

    if(result.status == 404) { 
     alert("Server config.js file not found."); 
     return false; 

} 的console.log(數據); //在這裏檢查

});  
}; 
+0

您添加的代碼將永遠不會執行,因爲退出該函數之前線路上的'return'語句。 – Guffa