Как мне вернуться за пределы функции? - PullRequest
0 голосов
/ 28 января 2011

Как вернуть значение из $ .ajax во внешнюю функцию? В приведенном ниже примере я хочу, чтобы getProxySrc () возвращала streamSrc. Кроме того, я не хочу связывать javascript / страницу, пока это происходит ... но в то же время конкретный блок кода требует вывода xml для продолжения. Какой лучший способ справиться с этим? Какой-то опрос?

function getProxySrc(xmlSrc){
    var streamSrc;
    $.ajax({
        type: "GET",
        url: xmlSrc,
        dataType: "xml",
        success: function(xml, textStatus) {
            $(xml).find('VideoStream').each(function(){
                streamSrc = $(this).text();
                console.log("Stream found: " + clip);
                return streamSrc;
            }); 
        }
    });
}

Ответы [ 2 ]

1 голос
/ 28 января 2011

Это уже асинхронно, поэтому поток скриптов становится свободным, как только запрос выполняется.

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

Ознакомьтесь с некоторыми библиотеками обещаний JavaScript, которые предназначены для того, чтобы дать вам лучшее средство описания рабочих процессов, охватывающих множество асинхронных вызовов.

Этот проект предназначен для MooTools, но Readme дает хорошее описание природы проблемы и природы решения в стиле "обещания".

https://github.com/ShiftSpace/promises

0 голосов
/ 28 января 2011

JavaScript в браузере однопоточный.Вы не можете асинхронно ждать завершения операции, например, используя цикл.

Вам также нужно будет заставить функцию обратного вызова вызывать другую функцию, когда запрос завершается (вместо того, чтобы каким-либо образом возвращать)"к другой функции), или сделайте запрос AJAX синхронным (передав async: false как часть параметров запроса).

Так как вы не хотите блокировать, остается только обратный вызоввариант.Если вы хотите немного изменить свой дизайн, вы можете добавить второй параметр к функции getProxySrc, который будет функцией, выполняемой при получении proxy-src:

function getProxySrc(xmlSrc, onProxyObtained) {
    $.ajax({
        //...
        success: function(xml, textStatus) {
            // ...
            if (onProxyObtained) {
                onProxyObtained(theProxy);
            }
        }
    });
}

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

...