使用async:true的Jquery ajax请求不返回值

时间:2012-03-08 13:39:40

标签: ajax asynchronous callback

使用async:设置为false,函数返回正确的值。但它会阻止浏览器。我试图添加回调,但它没有返回正确的值!

function find_route(array_bustops){
        var myresults;
            $.ajax({

            type: 'POST',
                async: true,  //with async:false it works
            url: 'find_routenum.php',

            data:{

                array_bustops:JSON.stringify(array_bustops)

            },
            dataType:'json', //html,xml

            success: function(my_results){

                myresults=my_results;


            },

            error:function(x,e){
                if(x.status==0){
                alert('You are offline!!\n Please Check Your Network.');
                }else if(x.status==404){
                alert('Requested URL not found.');

            }


        });

        return myresults;
    }

WITH CALLBACK:

function find_route(array_bustops,callback){
        var myresults;
            $.ajax({

            type: 'POST',
                async: true,  //with async:false it works
            url: 'find_routenum.php',

            data:{

                array_bustops:JSON.stringify(array_bustops)

            },
            dataType:'json', //html,xml

            success: function(my_results){

                callback(array_bustops,my_results)


            },

            error:function(x,e){
                if(x.status==0){
                alert('You are offline!!\n Please Check Your Network.');
                }else if(x.status==404){
                alert('Requested URL not found.');

            }


        });

        return myresults;
    }
    function find_route2(myresults){
           return myresults;
    }

然后我按如下方式调用该函数:

arr_one=find_route(arr,find_route2)

但是arr_one返回undefined。

编辑:它仍然无法使用async:设置为true

3 个答案:

答案 0 :(得分:3)

arr_one = find_route(ARR,find_route2)

这与异步无关,而是与代码的架构无关。

你在find_route的范围内声明了我的结果,当你调用find_route时,该函数会返回未定义的myresults的值,因为你只对它进行delcare。

尝试声明var myresults ='somevalue';在你的功能

现在你的函数返回'somevalue'

这是因为对ajax方法的调用不会停止函数执行,并且在调用find_route之后将执行success方法,并且只返回一个console.log,你会看到它最终将获得日志成功被称为。

设置async false时可以正常工作,因为你发现在ajax调用返回之前停止函数执行停止时async为false

编辑:可能的解决方案

function DataListener(val){
    this.val = val;
    this.remoteFetch();
}

DataListener.prototype.set = function(val){
    this.val = val;
    this.notifyListener(val)
}
DataListener.prototype.get = function(val){
    return this.val;
}

DataListener.prototype.remoteFetch = function(){
    $.ajax({
        success:$.proxy(this, 'set')
    })
}

var arr_one = new DataListener('somevalue');
alert(arr_one.get());// alert somevalue

function doSomething(arr_one_value){
    alert(arr_one_value); // the new value set from the ajax call   
}

arr_one.addListener(doSomething);

答案 1 :(得分:1)

乍一看,你将两个参数传递给你的回调,但在你的实际回调函数中,你只接受一个。

callback(array_bustops,my_results); 

// your callback function  
function find_route2(myresults){
       return myresults;
}

尝试仅将结果传递给参数。

callback(my_results);

答案 2 :(得分:0)

function find_route(array_bustops){
            $.ajax({

            type: 'POST',
                async: true,  //with async:false it works
            url: 'find_routenum.php',

            data:{

                array_bustops:JSON.stringify(array_bustops)

            },
            dataType:'json', //html,xml

            success: function(my_results){

                // HOW ABOUT PUTTING THE NEXT DESIRED FUNCTIONALITY HERE? //
                return my_results 

            },

            error:function(x,e) {
                if(x.status==0) {
                    alert('You are offline!!\n Please Check Your Network.');
                }else if(x.status==404) {
                    alert('Requested URL not found.');
                }
                //AND THE DUMMY RETURN VALUE OF THE FUNCTION IS HERE//
                return FALSE;
            }


        });

        return myresults;
    }