0

我需要一种更好的方法来从我的服务器检索数据并将其加载到我的应用程序控制器中。

目前,我正在使用 jQuery 的 built-in $.ajax,但由于 jQuery 主要关注 UI/UX 操作,它不会在返回请求结果之前等待结果,我不知道我这样做是否正确,但是这就是我目前的设置方式:

var get_data = function(){
    var result = false;
    $.get('/get/some/data').done(function(awesome_data){
        result = awesome_data;
    });

    return result;
}

但是这个方法不起作用,只是返回false

我读到您可以将async选项勾选为false,但如果用户处于高延迟环境中,它可以轻松挂起整个应用程序(我正在编写的应用程序非常庞大)。

是否有任何其他库可以做我想要实现的目标,或者有没有一种方法可以使用jQuery.AJAX,以便我可以非异步地从服务器检索数据并且不挂起应用程序?

谢谢小伙伴们的帮助。

4

5 回答 5

0

在 JS 中同步检索数据而不挂起应用程序是不可能的。不要去看其他库,因为考虑到浏览器 JS 的限制,核心概念没有意义。

但是,你只需要稍微重构一下你的代码就可以了。基本上,将您的代码分解为一系列步骤,在这些步骤之间调用服务器(如果还不是那样的话)。例如,假设您的代码看起来像这样:

function update() {
    data = $.get(...);
    ... code to update your display with the data ...
}

(而不是更新显示,您当然可以在该数据上进行计算,执行更多请求,等等。)

尝试将其分解为“之前”和“之后”步骤,而不是:

function startUpdate() {
    $.get('/get/some/data').done(function(data) {
        updateDisplay(data);
    });
}

function updateDisplay(data) {
    ... code to update your display with the data ...
}
于 2013-07-15T18:25:44.833 回答
0

您使用的是什么服务器端技术?您的性能问题通常与服务器上的线程有关。减慢 ajax 调用以同步操作将产生更多瓶颈,因为线程将挂起,直到所有请求都完成。

考虑将异步调用的代码封装在一个新线程中,以允许线程全部异步操作。通常我发现即使异步请求仍然在同一个线程中执行,只是以不同的时间间隔执行。

例如,我有一个页面可以进行多次长期 ajax 调用,每个调用都有自己的微调器。

如果单击页面上的链接,则必须等待所有 ajax 调用完成,然后才能识别单击并处理浏览器的请求。如果 ajax 调用被分拆到它们自己的线程中,如果我单击一个链接,它将处理请求并且未完成的线程将被放弃。

于 2013-07-15T18:15:51.340 回答
0

您不能简单地调用该getData函数。

如果你打电话,Ajax 请求只是注册和发送,不会在那里等待并得到结果。

该语句只是发送请求并false立即返回给您..

done您必须在本身声明的函数处获取/继续您的操作$.get()..像

$.get('/get/some/data').done(function(awesome_data){
    result = awesome_data;
       //  
       //    Here you have to do further.. after getting result..
       //
}); 
于 2013-07-15T18:16:42.340 回答
0

尝试使用变量来检测 ajax 请求是否完成。让我们命名它isAjaxRunning当您调用该函数时,您将变量设置为 false。在 ajax 函数的回调中,您可以将 ajax 响应设置为全局变量,并将 isAjaxRunning 变量设置为 false,如果您想在以后未知的时间使用数据。如果您想立即执行某项操作,请使用回调函数来执行您需要的操作。

如果您有一些依赖于 ajax 请求完成的东西,请检查变量。如果需要,您可以稍后使用 setTimeout() 和 setInterval() 再次检查变量,或者等待回调函数运行并从那里处理它。

于 2013-07-15T18:17:01.590 回答
0

免责声明:我是 Web Atoms 产品的作者。

这是不可能的,但是如果您想试用我们基于 Adob​​e Flex 的框架,我们已经简化了 AJAX,它看起来是同步的,但在属性系统跟踪 Promise 时异步工作,您可以同步分配 Promise。

然而,Web Atoms 需要一个学习曲线,它旨在将应用程序从 Adob​​e Flex 迁移到具有类似 Adob​​e Flex 概念的 HTML5。

http://neurospeech.com/webatoms/docs/#page=concepts%2Fatom-promise.html

<select
    atom-name="countryCombo"
    atom-type="AtomComboBox"
    atom-items="{ AtomPromise.json('country-list.json')}">
</select>

<span 
    atom-text="['Selected Country Code is ' + $scope.countryCombo.value]" >
</span>
于 2013-07-15T18:29:51.243 回答