我得到了一个Jquery ajax调用,它从我得到的php文件获取json响应,json响应很好,我可以正确控制日志响应,但是我似乎无法保存信息在ajax结果之外,它不会更新数组。代码看起来像这样,我在下面发布了结果。
window.array={name: 'john',color:'red'};
console.log(array['name']);
console.log(array['color']);
$.ajax({
url : 'getJsons.php',
type : 'POST',
data : data,
dataType : 'json',
success : function (data) {
array['name'] = data['name'];
array['color'] = data['color'];
console.log(array['name']);
console.log(array['color']);
}
});
console.log(array['name']);
console.log(array['color']);
这将导致以下控制台:
john
red
john
red
marry
blue
所以我第一次就把控制台弄好了,但似乎在ajax调用之前的ajax调用之后加载了脚本,为什么呢?因为这使得我无法在代码的其余部分中使用ajax结果,因为它已经在脚本加载后被提取。有没有办法让ajax在其余部分之前运行?
答案 0 :(得分:3)
由于您无法判断服务器的ajax响应何时到达,因此默认情况下AJAX是异步的。这意味着$.ajax
get被触发,然后javascript引擎继续执行你的其余代码(在你的例子中是ajax调用之外的两个console.log
)。在将来的某个地方,ajax调用可能(或可能不)从服务器获得响应(并通过更改它的状态来通知它)。此时,javascript引擎将处理所谓的“回调”函数 - 代码将在ajax调用完成时执行。您将回调函数定义为ajax方法的success
参数。
这就是为什么执行代码的正确方法是运行依赖于回调函数结果的所有内容。将所有内容直接放在那里,或者声明一个单独的函数,然后可以在success函数中调用它:
$.ajax({
/*...*/,
success : function (data) {
array['name'] = data['name'];
array['color'] = data['color'];
/* either put all your dependent code here */
/* or just call a callback function: */
callback(data);
}
});
/* code to be executed after the ajax call */
function callback(data){
// work with the response here
console.log(data);
}
未来的坏主意:
或者,您可以将呼叫告知同步(这很糟糕,因为您的浏览器在等待服务器的答复时基本上被冻结)并保持您的代码不变。
$.ajax({
/*...*/,
async : false,
});
// risk some waiting time (possibly the full duration of a timeout!!)
// the browser is locked during this time
// continue normally
console.log(array['name']);
console.log(array['color']);
答案 1 :(得分:1)
在ajax调用完成之前运行查询后的代码是什么。您的数组已经填充,不要担心,但因为AJAX异步运行,它只会在ajax调用后分配值。
例如,如果你在ajax调用后设置10秒超时(取决于AJAX调用的时间长度),然后调用数组值,你会发现它们被填充(假设AJAX已经运行并经历了回调函数正确)。
所以在你的代码中,这里一步一步地发生了什么。
You display the values from the array which shows john red
You make the AJAX call, when this call has completed it will perform your success: function
The ajax call takes (lets say) 1 second to complete
Whilst your page is waiting for the call to complete and update the values it moves onto the next bit of code which displays the array, as the array hasn't been updated yet as success hasn't been called it still displays john red
1 seconds later the success function is called, assigns the new names to the array and prints them out.
答案 2 :(得分:1)
ajax调用是异步的,这意味着无论何时执行和返回ajax,都将执行其余的代码。如果您的代码取决于结果,请将其包装在函数中并从ajax(成功函数)的回调中调用它。
答案 3 :(得分:0)
我不知道这些东西是不是标准的东西,但是它起作用了:
var xmlURL = "Data/XML/"+GetURLParameter("xml");
var xmlInto = {};
$.get(xmlURL, function(xml) {
$(xml).find("line").each(function(){
xmlInto[line_number] = line_info;
});
}, 'xml');
console.log(xmlInto);