过去4个月我们在EmberJS中构建了一个应用程序。由于我们客户的要求,我们选择不使用Ember Data,因为他们不希望处于alpha状态的依赖关系,因此我们将自己的数据层放在一起相对简单。我们定义了定义路由和dataAdapter的服务类,它们可以调用多个服务并以可用的格式显示数据。我们已经开始注意到,内存消耗不断增加,直到应用程序变得过载而无法在合理的时间内响应。
我已经运行了Chrome时间线记录器,当我们加载数据时,我们看到一些XHR加载会导致大的净内存增加,当数据为10K或更少时会导致1到10 MB的跳转。我还在另一个使用相同服务/ dataAdapter体系结构构建的网站上运行记录器(减去ember deferreds / promises),我没有看到任何这样的峰值,内存显示出预期的水平。
这是我们的代码:
App = Ember.Application.create();
App.Router.map(function() {
// put your routes here
});
App.IndexRoute = Ember.Route.extend({
model: function() {
var dataAdapter = new App.StatusDataAdapter();
return dataAdapter.load()
.then(function(results) {
return results.statuses;
});
}
});
(function($) {
$.mockjax({
url: '/config/status_lists/task_status',
type: 'GET',
responseText: ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
});
})(jQuery);
App.StatusService = (function () {
function init() {
return {
load: function() {
"use strict";
var url = '/config/status_lists/task_status',
self = this,
hash = {
url: url,
type: 'GET',
context: this,
dataType: 'json'
};
return new Ember.RSVP.Promise(function(resolve, reject) {
hash.success = function(json) {
Ember.run(null, resolve, json);
};
hash.error = function(jqXHR) {
Ember.run(null, reject, adapter.ajaxError(jqXHR));
};
return Ember.$.ajax(hash);
});
}
};
}
return init;
})();
App.StatusDataAdapter = (function () {
function init() {
return {
load: function() {
"use strict";
var service = new App.StatusService(),
promises = {
statuses: service.load(),
status2: service.load(),
status3: service.load(),
status4: service.load(),
status5: service.load()
};
return Ember.RSVP.hash(promises)
.then(function (results){
console.log('statuses loaded');
return results;
});
}
}
}
return init;
})();
我在http://jsfiddle.net/jessesanders/95fP5/组建了一个JSFiddle,它非常模仿我们正在做的事情。每次单击运行时,我都看到内存跳起,直到它达到大约100 MB,然后它停止增加。这让我很担心,因为这是一个数据负载较小的超级简单示例。我们正在使用更大的数据负载进行更多负载,并观察浏览器停止运行。
有关如何解决此问题的任何想法?我们是否需要明确释放资源或做出错误导致这种情况?我没有选择使用Ember Data,因此我必须使这些数据正常工作并且运行良好。感谢所有帮助和想法。
提前致谢!