我正在使用ajax从数据库中获取一些值。在我的java脚本文件中,我有一个全局变量,某些函数需要访问它。我需要从数据库中的值填充该变量。当我使用ajax时,变量保持为空。如果我在我的ajax代码中使用async:false
,我会在浏览器的开发工具中收到该警告消息:
jquery-3.2.1.min.js:4 [弃用]主线程上的同步XMLHttpRequest因其对最终用户体验的不利影响而被弃用。如需更多帮助,请查看https://xhr.spec.whatwg.org/。
此外,使用上述内容并不会填充导致其他函数出错的变量。另外,根据我的阅读,这已被弃用,不应在任何情况下使用。
我的代码
var array ={};
var flag = 'true';
$.ajax({
url: "name.php",
method: "post",
data:{flag:JSON.stringify(flag)},
success: function(data) {
array = JSON.parse(data);
},
async: false,
error: function(xhr, ajaxOptions, thrownError) {
console.log(thrownError);
}
});
基本上我正在尝试做的是填充数组变量并使其成为正确的数组。
来自数据库的数据就像这样
{
'something': { 'act1': 'act1a','act2': 'act2a'},
'something2': { 'act1': 'act1a','act2': 'act2a'}
}
任何人都有任何关于如何实现这一目标的建议?
PS: 我需要用ajax响应来填充一个变量,这个变量可以被其他函数访问...不能将JSON对象转换为Javascript数组......我正在以字符串格式检索数据
答案 0 :(得分:3)
根据您的问题和代码,我认为您在加载数据之前尝试访问array
对象。首先,您需要删除async:false
。你希望这是异步的。这就是ajax的本质。其次,确保在 ajax调用完成后使用array
“执行操作”。例如,这不起作用:
var array ={};
var flag = 'true';
$.ajax({
url: "name.php",
method: "post",
data:{flag:JSON.stringify(flag)},
success: function(data) {
array = JSON.parse(data);
},
error: function(xhr, ajaxOptions, thrownError) {
console.log(thrownError);
}
});
//DO STUFF WITH array here.. will not work
但这会奏效:
var array ={};
var flag = 'true';
$.ajax({
url: "name.php",
method: "post",
data:{flag:JSON.stringify(flag)},
success: function(data) {
array = JSON.parse(data);
//DO STUFF WITH array here..
},
error: function(xhr, ajaxOptions, thrownError) {
console.log(thrownError);
}
});
此处还需要考虑的一件事 - 通常的做法是在ajax success
函数之外创建一个 函数来对您的数据执行某些操作(array
),然后调用从success
函数内部开始运作:
var array ={};
var flag = 'true';
$.ajax({
url: "name.php",
method: "post",
data:{flag:JSON.stringify(flag)},
success: function(data) {
array = JSON.parse(data);
doStuffWithArray(array);
},
error: function(xhr, ajaxOptions, thrownError) {
console.log(thrownError);
}
});
function doStuffWithArray(myArray) {
//DO STUFF HERE...
}
答案 1 :(得分:1)
因此,假设您正在进行ajax调用和端点,您可能希望稍后使用它的响应,而不是在ajax调用成功时,无论出于何种原因。一种方法是传递$.ajax
方法返回的promise / deferred。使用此对象,您可以附加任何promise / deferred方法来处理promise的拒绝或拒绝。例如:
//first we'll create a dummy deferred. we will pretend that this is our ajax call. in actual code this would look something like
//var dummyDeferred = $.ajax(...);
var dummyDeferred = $.Deferred();
//lets say, maybe you do want something to happen immediately upon the request success. you can do that.
dummyDeferred.then(function(data){
console.log("immediate then", data);
});
//now lets say that the ajax finishes, you should see the console log as you'd expect from the above then()
dummyDeferred.resolve("hello!");
//now lets say that some time later, you want to use that result inside another method to do something. to do that you can simply attach another then() to the promise/deferred
//we'll use a timeout to simulate later usage of the promise/deferred
setTimeout(function(){
doOtherStuff(dummyDeferred);
}, 5000);
function doOtherStuff(promise) {
//maybe you want to take the data response and put it on the page some how. you can!
promise.then(function(data){
$(document.body).append(data);
});
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
答案 2 :(得分:1)
var array;
var flag = 'true';
$.ajax({
url: "name.php",
method: "post",
data:{flag:JSON.stringify(flag)},
success: function(data) {
array = JSON.parse(data);
function_ThatNeeds_Thearray();
},
async: false,
error: function(xhr, ajaxOptions, thrownError) {
console.log(thrownError);
}
});