我对JavaScript没有多少经验,我在使用变量范围和jquery时遇到了麻烦。我有以下结构:
function pass_variables()
{
username = "efcjoe"
response = post_variables(username)
alert(response)
}
function post_variables(username)
{
$.post(
'/path/to/url/',
{
'username': username,
},
function(data)
{
valid = (data != 0) ? true : false
// OPTION 1: If I put return here...
return valid; // ... the alert box in pass_variables says "undefined"
},
"text"
);
// OPTION 2: If I put return here...
return valid; // ... The alert box does not pop up, and Safari debug gives
// me the error: "Can't find variable: valid"
}
我错过了什么吗?我认为valid
应该是一个全局变量,因此选项2应该可以正常工作。我真的不确定选项1。
任何人都可以就如何使其发挥作用向我提出任何建议吗?
非常感谢。
答案 0 :(得分:8)
Ajax调用是异步的,这意味着它们被调用但是等待执行完成。基本上,您的警报在ajax请求完成之前触发,并运行回调函数来更改您的变量。
你可以做的最好的事情是在ajax请求完成时传递一个函数来运行。这也否定了对全局变量的需求,因为其他插件,脚本可以改变它们的状态并让你的脚本容易出错,缺陷等等,这是不受欢迎的全局变量。
E.g
function foobar(){
//call function to do post request and also pass a function to run
//when post has returned
runPostRequest( callbackFn );
}
function runPostRequest(callback){
$.post( '/foo', callback );
}
function callbackFn( data ){
console.log('post request complete');
}
答案 1 :(得分:3)
是的,你的问题是你在这里没有掌握一些操作顺序。您传递给$.post
的功能是回调;在post_variables()
完成后,它会很晚才运行。 post_variables()
本身并不等待$.post
完成,因此当您尝试使用valid
时,{{1}}不存在。
答案 2 :(得分:3)
在选项1 中,您将从回调函数返回,并且永远不会使用其返回值,因为只有在Ajax请求结束时才会调用此函数。
在选项2 中,您将从main函数返回,但该回调发生在回调函数为您的valid
变量赋值之前。
我会以这种方式重构您的代码,而不使用全局变量:
function post_variables(username){
$.post('/path/to/url/',{
'username': username,
},
function(data){
var valid = data != 0;
// OPTION 3: Work in the callback function
alert(username);
alert(valid);
// OPTION 4: Pass the values and work on another function
otherFunction(username, valid);
},"text");
}
function otherFunction(username, isValid){
//...
}
答案 3 :(得分:2)
请记住,AJAX是异步的。 return valid;
在$.post()
设置之后,但在帖子完成之前(因此,在定义valid
之前)立即执行 。您可能想要做的是:
function post_variables(username)
{
var username = "efcjoe";
$.post(
'/path/to/url/',
{
'username': username,
},
function(data)
{
var valid = (data != 0) ? true : false
alert(valid);
},
"text"
);
}
请注意,这不再需要全局变量,而是需要使用var
声明的函数范围变量。
答案 4 :(得分:1)
您可以通过为函数分配函数而不是内联函数来轻松解决问题,并且事件函数会执行警报:
function pass_variables()
{
username = "efcjoe"
response = post_variables(username);
}
function post_variables(username)
{
$.post(
'/path/to/url/',
{
'username': username,
},
receivedData,
"text"
);
}
function receivedData(data)
{
valid = (data != 0) ? true : false;
alert(valid)
}