我是新手,必须回答以下问题:
我声明了一个全局变量并改变了函数中的值。但在价值之外仍然是旧的。
var allowDrag = 'false';
$.get('/cakeorga2/ajax/is_admin/', function (data) {
allowDrag = data;
console.log ('allowDrag in function : '+allowDrag);
});
console.log ('outside of the function : '+ allowDrag);
控制台日志是:
outside of the function : false
allowDrag in function : true
有什么建议吗?
答案 0 :(得分:3)
$.get
是$.ajax
的简写方法:
执行异步 HTTP(Ajax)请求。
ajax调用通常是异步的,因此主console.log
将在$ .get执行完成之前触发(正如您在控制台命令中看到的那样),并且在那一刻allowDrag
值为仍然是false
。
答案 1 :(得分:1)
你被困了。全局变量的行为与您预期的完全相同。它在第二个console.log
中没有新值的原因是另一个:当您执行console.log
时,使用$.get
发出的ajax调用尚未得到答复。如果您需要像这样使用它,则必须使用async: false
选项使呼叫同步。
答案 2 :(得分:1)
使用deferred.then()仅在更新值后调用第二个console.log()(ajax GET成功)
$.get('/cakeorga2/ajax/is_admin/', function (data) {
allowDrag = data;
console.log ('allowDrag in function : '+allowDrag);
}).then( function(){
console.log ('outside of the function : '+ allowDrag);
}
);
答案 3 :(得分:1)
这是因为ajax
来电是asynchronous。异步(在您的使用案例中)意味着您的outside of the function console.log
将在ajax
调用返回之前执行。
答案 4 :(得分:1)
那很可能是因为函数外部的console.log在函数内部之前被调用,因为你必须自己调用函数并且它周围的代码会自动“播放”。但由于我不熟悉Ajax / jQuery,我可能错了。
答案 5 :(得分:1)
与 $。ajax()
同步var allowDrag = 'false';
allowDrag = $.ajax(
{
url:'/cakeorga2/ajax/is_admin/',
async:false
}).responseText;
console.log ('outside of the function : '+ allowDrag);