【发布时间】:2016-11-01 18:17:49
【问题描述】:
我正在构建一个 Angular 应用程序,该应用程序使用长轮询来在服务器发生变化时接收快速更新。我像这样使用 $resource 来获取实际数据:
appServices.factory('Data', ['$resource',
function(){
return $resource('', {}, {
query: {"url": …, isArray: false}
});
}]);
然后我有一个服务来处理长轮询:等待数据加载;将它们存放在某个地方;一秒钟后,开始下一个长轮询周期:
app.factory(„DataLoader“, [„Data“, "$timeout", function(Data, $timeout) {
return {
loadData: function() {
var parent = this;
var data = Data.query({},
function(result) {
/* do something to the data,
* then start waiting for an update from the server again
*/
$timeout(function() {
parent.loadData();
}, 1000);
}
);
}
};
});
到目前为止,它就像一个魅力。
但是,我现在正在尝试为此编写量角器测试。问题是:只有在数据没有变化的情况下,服务器才会在 30 秒后超时长轮询请求。当我在 $timeout 内等待新数据时,量角器会在任何结果到达之前超时。
我在最后一个小时用谷歌搜索了,但似乎没有解决方案,除了使用 $interval 而不是 $timeout。这适用于一个很好的旧轮询设置(每 3 秒轮询一次,如果没有新内容,则从服务器获取空结果)。但是,为了避免这种情况,我实施了长轮询。 $timeout 对我来说是更明智的选择。
您能给我一些提示如何让 Protractor 在这种环境中成功运行吗?
【问题讨论】:
-
如果您不想使用
$interval,我认为您唯一的其他选择就是禁用量角器与 Angular 的同步。browser.ignoreSynchronization = true;不确定是否有其他选择 -
感谢@Gunderson 的提示!我最终这样做了,然后手动等待 DOM 元素使用预期条件出现。
标签: angularjs protractor long-polling