我需要一种更好的方法从我的服务器检索数据并将其加载到我的应用程序控制器中。
目前,我正在使用jQuery内置的$.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
以便我可以非异步地从服务器检索数据而不挂起应用程序?
感谢帮助人员。
答案 0 :(得分:0)
您使用的服务器端技术是什么?您的性能问题通常会加到服务器上的线程上。减慢ajax调用以同步操作将导致更多的瓶颈,因为线程将挂起直到所有请求都已完成。
考虑包装在新线程中进行异步调用的代码,以允许所有线程异步操作。通常我发现即使异步请求仍然在同一个线程中执行,只是以不同的间隔执行。
例如,我有一个页面可以生成几个长期存在的ajax调用,每个调用都有自己的微调器。
如果我点击页面上的链接,我必须等待所有ajax调用完成才能识别到点击并处理浏览器的请求。如果ajax调用被分离到他们自己的线程中,如果我单击一个链接它将处理请求并且未完成的线程将被放弃。
答案 1 :(得分: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..
//
});
答案 2 :(得分:0)
尝试使用变量来检测ajax请求是否已完成。我们将其命名为isAjaxRunning
当您调用该函数时,将变量设置为false。在ajax函数的回调中,如果要在以后未知的时间使用数据,可以将ajax响应设置为全局变量并将isAjaxRunning变量设置为false。如果您想一次做某事,请使用回叫功能来完成您的需要。
如果您的某些内容取决于完成的ajax请求,请检查该变量。如果需要,您可以使用setTimeout()和setInterval()稍后再次检查变量,或者只是等待回调函数运行并从那里处理它。
答案 3 :(得分: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 ...
}
答案 4 :(得分:0)
免责声明:我是Web Atoms产品的作者。
这是不可能的,但是如果您想尝试我们的基于Adobe Flex的框架,我们已经简化了AJAX,它看起来是同步的,但是作为属性系统跟踪承诺异步工作,您可以同步分配promises。
但是,Web Atoms需要学习曲线,它旨在将应用程序从Adobe Flex迁移到HTML5,并使用类似的Adobe Flex概念。
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>