我有一个函数,现在通过AJAX调用检索JSON文件并在控制台上打印出它的内容。但是,我无法让它读取文件。我知道位置格式正确,但json
变量将始终返回值null
,表示文件不存在。
function loadSettings(){
//loads setting list from mcc.json
var options = (function() {
var json = null;
$.ajax({
'async': false,
'global': false,
'url': "js/mcc.json",
'dataType': "json",
'success': function (data) {
json = data;
}
});
return json;
})();
console.log(options);
}
我的AJAX通话是否有问题?
答案 0 :(得分:2)
仅当ajax调用完成时才会发生成功/完成回调。因此,您的函数实际上没有返回任何内容(“return json”)。
在AJAX中,您需要获取数据对象,然后调用接下来应该运行的内容,因为任何成功或完整的回调函数将在您执行的代码之后,当服务器的响应返回时发生。
基本上,在ajax调用完成之前,您将返回json变量。
答案 1 :(得分:0)
AJAX
是由它的名称本身进行的异步调用,所以它是一个非阻塞代码,所以你的
return json
将立即(您指定为null),在响应从服务器返回一段时间后,将执行success
回调,该回调仍然可以访问该变量({ {1}})在外部封闭中声明。
而是尝试返回一个承诺,并在数据进入json
回调时解决该承诺。并且在promise的使用结束时,使用带有回调的success
来获取数据时使用数据进行解析。
修改强>
在编辑中,我正在编辑您的代码并添加到此答案,使用承诺并立即返回承诺以使用相同的模式工作
then
答案 2 :(得分:0)
由于您从一个立即调用的函数中分配了options
返回的值,您应该记住,javascript不会停止执行或等待任何异步请求被解析您的IIFE将立即返回(在您的情况下,json
设置为null)
如果您需要处理返回的数据,请在success
回调
答案 3 :(得分:0)
返回JSON数据时,AJAX调用尚未完成。有人提到使用承诺,但替代方案如下所示。这在AJAX完成后调用doTheNextThing函数。在新功能中处理您的设置。
function loadSettings(){
var options = (function() {
$.ajax({
'async': false,
'global': false,
'url': "js/mcc.json",
'dataType': "json",
'success': function (data) {
doTheNextThing(data);
}
});
})();
}
//------------------------------------------
function doTheNextThing(data)
{
//Now process your load settings here
}