如何返回功能外?

时间:2011-01-28 03:13:29

标签: javascript jquery xml ajax polling

如何将$ .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 个答案:

答案 0 :(得分:1)

这已经是异步的,因此一旦请求开始,脚本线程就会自由。

不幸的是,由于您没有同步调用堆栈,因此无法返回。您必须让您的成功处理程序使用它接收的值调用流程的下一部分。

查看一些javascript promises库,这些库旨在为您提供更好的方法来描述跨越大量异步调用的工作流。

这个项目适用于MooTools,但自述文件很好地描述了问题的本质以及“承诺”风格解决方案的本质。

https://github.com/ShiftSpace/promises

答案 1 :(得分:0)

浏览器中的JavaScript是单线程的。例如,您不能异步等待操作完成循环使用。

当请求完成时,您需要让回调函数调用另一个函数(而不是以某种方式“返回”到另一个函数),或者使AJAX请求同步(通过传入async: false作为请求选项)。

由于您不想阻止,因此将回调作为唯一选项。如果您愿意稍微更改一下设计,可以在getProxySrc函数中添加第二个参数,该函数是获取proxy-src时要执行的函数:

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

然后,调用者可以传入一个函数,在结果可用时立即对结果执行任何操作,而不需要轮询。