0

我有一个从函数AJAX调用的javascript函数。像这样的东西:

(CODE1)
//javascript function calling AJAX.
var function check(){
  var status = chkHoliday(date,'Date Chosen');
  alert('called');
  return status;
}

//AJAX function
function chkHoliday(date,str){
    var flag = true;
    $.ajax({ 
        type: "GET",
        url: someurl,
        async: false,          //if commented, the alert() from the caller function is called before completion of this function.
        dataType: "json",
        success: {
            flag = false;
        }
    });
    return flag;
}

它运作良好。唯一的问题是,由于 async 设置为false,因此网页会暂停一段时间,但随后会继续进行。

为了避免这种情况,我读了一些关于回调函数的东西,所以我试了一下:(CODE 2)

//javascript function calling AJAX.
var function check(){
    var status;
    chkHoliday(date,'Date Chosen',function(retVal){
        status = retVal;
    });
    if(status != null){
       alert(status);
       return status;
    }
    else{
       alert(true);
       return true;
    }
}

//AJAX function
function chkHoliday(date,str,callback){
    var flag = true;
    $.ajax({ 
        type: "GET",
        url: someurl,
        //async: false,          //if commented, the alert() from the caller function is called before completion of this function.
        dataType: "json",
        success: {
            flag = false;
            callback(flag);
        }
    });
    //return flag;
}

AJAX这有效,但在函数完成声明“未定义”之前再次调用了警报。我不知道我做错了什么。

我希望该AJAX函数应该等到它完全执行然后返回调用函数并在调用函数中运行下一个语句并停止进程(即使用异步)。我还希望AJAX我的调用者函数可以轻松访问返回的值。

4

3 回答 3

0

将警报放在回调函数中。否则无论成功或错误,警报都会同时工作。

于 2013-10-01T04:17:04.563 回答
0

将警报放在回调函数中:

chkHoliday(date,'Date Chosen',function(retVal){
        status = retVal;
       if(status != null){
           alert(status);
       }
    else{
       alert(true);
    }
});

但请注意,您不能再像预期的那样使用 return 语句,因为它是异步的。

于 2013-10-01T04:03:28.583 回答
0

由于 AJAX 是异步工作的,所以将它放在一个函数中并返回一个值是一个问题。为了解决这个使用延迟的承诺。这将向调用者承诺 ajax 结果。略有不同。这是一个例子。对我来说就像一个魅力。当然,您需要根据需要对其进行调整,但您真正需要做的就是创建数据对象。

var data = {}

function chkHoliday(data) {
    var deferred = $.ajax({
        method: "post",
        url: ajaxURL,
        dataType: "json",
        data: data
    });
    return deferred.promise();
}

chkHoliday(data).done(function (response) {
    console.log(response);
}

从您的 php 文件返回

echo json_encode(array("success"=>"hello"));
于 2013-10-01T04:04:22.367 回答