Ajax-запрос Jquery с async: true не возвращает значение - PullRequest
0 голосов
/ 08 марта 2012

Если для параметра 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;
    }

С ЗВОНОКОМ:

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 возвращает неопределенное значение.

РЕДАКТИРОВАТЬ: он все еще не работает с асинхронным: установлено в true

Ответы [ 3 ]

3 голосов
/ 08 марта 2012

arr_one = find_route (обр, find_route2)

это не имеет ничего общего с асинхронностью, но с архитектурой вашего кода.

вы объявляете myresults в области find_route, когда вы вызываете find_route, функция возвращает значение myresults, которое не определено, потому что вы delcare только для него.

Попробуйте объявить var myresults = 'somevalue'; в вашей функции

Теперь ваша функция возвращает 'somevalue'

Это происходит потому, что вызов метода ajax не остановит выполнение функции, а метод успеха будет выполнен после вызова и возврата find_route, просто поместите туда console.log, и вы увидите, что он получит журнал в конце концов, когда успех называется.

Это работает, когда установлено async false, потому что async false при обнаружении останавливает выполнение функции до возвращения вызова ajax

Редактировать: возможное решение

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 голос
/ 08 марта 2012

На первый взгляд, вы передаете два аргумента вашему обратному вызову, но в вашей действительной функции обратного вызова вы принимаете только один.

callback(array_bustops,my_results); 

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

Попробуйте передать в аргумент только результаты.

callback(my_results);
0 голосов
/ 17 июля 2013
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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...