Возвращать значение в функцию только после завершения вызова ajax? - PullRequest
0 голосов
/ 04 апреля 2011

Итак, я использую mootools, и у меня есть функция, которая вызывает ajax-скрипт для получения значения.Это значение затем возвращается в функцию.Однако по какой-то причине функция слишком быстро возвращается для вызова AJAX!

Что я делаю не так ...

function getCredits() {
    var loadGlobalTab = new Request.JSON({
        url: {my api, url removed for security},
        evalScripts : true,
        async: false,    // I tried this, hoping it would stop the function from returning too soon, but no dice.
        onSuccess: function(returnInfo) {
            alert(returnInfo.data.total);
            return returnInfo.data.total;
        }
    }).send(sendData);    // Where sendData has been defined prior
}

Предупреждение возвращает правильное значение, поэтому я знаюВызов AJAX работает, однако сама функция ничего не возвращает, а это означает, что пока выполняется вызов AJAX, функция сразу завершается.

Я попытался поставить return 100 в конце, только для ударов, ифункция вернула 100.

Ответы [ 3 ]

4 голосов
/ 04 апреля 2011

изменить о дорогой. избит из-за телефонного звонка. фигу!

ajax является асинхронным и использует async: false - это просто неправильный путь. вместо этого запустите вторую функцию обратного вызова с результатом запроса, вызванного непосредственно из onComplete / onSuccess.

Если вам действительно нужно сделать это, чтобы он блокировался, тогда это прекрасно работает:

var blockingCheck = function() {
    var obj = {};
    new Request.JSON({
        url: '/echo/json/',
        data: {
            json: JSON.encode({
                text: 'some text',
                array: [1, 2, 'three'],
                object: {
                    par1: 'another text',
                    par2: [3, 2, 'one'],
                    par3: {}
                }
            }),
            delay: 3
        },
        async: false,
        onSuccess: function(response) {
            obj = response;
        }
    }).send();

    return obj;
};

console.log(blockingCheck());

http://jsfiddle.net/dimitar/eG4t2/

2 голосов
/ 04 апреля 2011

Аякс asynchronous

Это означает, что JS будет читать прямо через него, и если нет возврата, то ничего нет.

Хорошая вещь - обратный вызов вместо возврата:

function getCredits() {
    var loadGlobalTab = new Request.JSON({
        url: {my api, url removed for security},
        evalScripts : true,
        headers: {'ACCEPT': 'json','X_REQUESTED_WITH':'jsonhttprequest'},
        onSuccess: function(returnInfo) {
            alert(returnInfo.data.total);
            //goto callback
            getCredits_Callback(returnInfo.data.total);
        }
    }).send(sendData);    // Where sendData has been defined prior
}

function getCredits_Callback(total){
   //do something with total
}

2-й подход:

function getCredits() {
    var loadGlobalTab = new Request.JSON({
        url: {my api, url removed for security},
        evalScripts : true,
        headers: {'ACCEPT': 'json','X_REQUESTED_WITH':'jsonhttprequest'},
        onSuccess: getCredits_Callback
    }).send(sendData);    // Where sendData has been defined prior
}

function getCredits_Callback(returnInfo){
   //do something with returnInfo
}
1 голос
/ 04 апреля 2011

Он ничего не возвращает, потому что ваш оператор return возвращается в атрибут объекта, а не в переменную, к которой вы думаете, что он возвращается.Вам лучше передать функцию вашего onSuccess отдельной функции-обработчику.Таким образом, вы можете иметь дело с возвращаемыми значениями вне замыкания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...