我已经创建了一个函数,下面是我传递数据并按原样返回结果的函数。我这样做是因为我需要大量的ajax调用,而我只是创建了一个函数,我将数据传递给结果并获得结果并使用结果。
ImageButton
现在我在需要它的地方打电话:
function FunctionsCall(data){
var ret;
$.ajax({
type:'GET',
url: 'includes/helpers/functions.php',
dataType:"json",
data: data,
success: function(result){
ret = result;
}});
return ret;}
但奇怪的是我总是把x视为未定义。指出ret用1或0填充我不知道为什么它没有被传递给x。
你能帮帮我吗?它可能很简单,但我只是在需要时使用javascript和jquery进行实验。此致
答案 0 :(得分:1)
ret
不会被设置,这是ajax完成的时间。 FunctionCall
会立即返回。您需要返回ajax deferred对象或将addClass / removeClass功能放在成功函数中。
将addClass / removeClass功能添加到成功函数的方法如下:
function FunctionsCall(data, successFn) {
$.ajax({
type: 'GET',
url: 'includes/helpers/functions.php',
dataType: "json",
data: data,
success: successFn
});
}
$('#register-name, #register-surname').keyup(function(e) {
var element = $(this);
var data = { query: element.val(), funcid: 1 };
var successFn = function(x) {
if (x !== 1) {
element.addClass('input-has-error')
} else {
element.removeClass('input-has-error');
}
}
FunctionsCall(data, successFn);
});
答案 1 :(得分:1)
问题是ajax调用需要时间来执行,而x
的处理是在调用FunctionsCall
想象一下,为了转到php文件并获得结果,浏览器必须通过线路发送请求,服务器需要处理请求并再次通过线路返回值。此过程需要不可预测的时间,因为它依赖于网络连接和服务器规格/当前负载。
调用函数并处理结果的代码在此步骤之后立即发生,因此在运行时不会具有所需的值(浏览器执行下一步的速度比网络处理请求时快得多)。
最好的办法是将处理代码包装在自己的函数中,因此不会立即调用它,然后在获得结果后调用该函数。像这样:
// function defined, won't be called until you say so
var processMe = function(result) {
alert(result);
}
$.ajax({
// ajax params
success: function(result) {
// function called within success - when we know the request is fully
// processed, however long it takes
processMe(result));
}
});
您也可以直接在success
块中进行处理,但使用函数的优点是将来可以重复使用,此外,您还可以给它一个很好理解的名称,比如outputValidatedMessage
。
答案 2 :(得分:1)
您必须发送ajax请求同步
function FunctionsCall(data){
var ret;
$.ajax({
type:'GET',
async: false,
url: 'includes/helpers/functions.php',
dataType:"json",
data: data,
success: function(result){
ret = result;
}
});
return ret;
}
答案 3 :(得分:0)
Ajax调用是异步的。
这意味着当你调用$.ajax()
时,函数继续运行并返回未定义的x
,因为ajax响应尚未发送。
function FunctionsCall(data){
var ret;
$.ajax({
type:'GET',
async: false,
url: 'includes/helpers/functions.php',
dataType:"json",
data: data,
success: function(result){
ret = result;
}
});
return ret;
}
答案 4 :(得分:0)
检查以下是否有效,可能是您的GET方法需要时间来执行。
var x;
function FunctionsCall(data){
var ret;
$.ajax({
type:'GET',
url: 'includes/helpers/functions.php',
dataType:"json",
data: data,
success: function(result){
ret = result;
x= result;
alert(x)
}});
return ret;}
如果代码段有效,则应使您同步异步:false或生成回调函数
答案 5 :(得分:0)
可能是因为ajax函数是异步调用的,因此行var x = ....不会等待asignment,这就是为什么未定义的。为此你应该使用一个承诺这是一个例子http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/ http://www.htmlgoodies.com/beyond/javascript/making-promises-with-jquery-deferred.html
答案 6 :(得分:0)
以下内容适合您
function FunctionsCall(data){
var ret;
$.ajax({
type:'GET',
url: 'includes/helpers/functions.php',
dataType:"json",
data: data,
success: function(result){
(result !==1 ) ? $(this).addClass('input-has-error') : $(this).removeClass('input-has-error'); });
}});
}
答案 7 :(得分:0)
试试这段代码。
function FunctionsCall(data,callback) {
try {
ajax({
type: 'GET',
url: 'includes/helpers/functions.php',
dataType: "json",
data: data,
success: function (result) {
callback(result);
}
});
} catch(e) {
alert(e.description);
}
}
$('#register-name, #register-surname').keyup(function (e) {
var data = {
uery: $(this).val(),
funcid: 1
};
FunctionsCall(JSON.stringify(data), function (result) {
(result !== 1) ? $(this).addClass('input-has-error') : $(this).removeClass('input-has-error');
});
});