Jquery Ajax Call Return

时间:2015-06-27 08:14:44

标签: javascript jquery ajax

我已经创建了一个函数,下面是我传递数据并按原样返回结果的函数。我这样做是因为我需要大量的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进行实验。

此致

8 个答案:

答案 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');
    });
});