想象一下,页面上有Dashboard
个Items
。当页面加载时,e想要像这样处理它:
Dashboard
。dojo.Deferred
+ setTimeout
)加载所有Items
。Items
添加到Dashboard
。加载Item
后,我们会将其添加到Dashboard
。在此异步加载期间,我们希望页面可用于交互(UI线程未被冻结)。
代码可能看起来像这样:
var deferred = new Deffered();
setTimeout(function() {
array.forEach(items, function(item, i) {
loadItem();
deferred.progress(i + ' - loaded');
});
deferred.resolve();
}, 0)
deferred.then(function() {
addItemsToDashboard();
}, function(err) {
}, function(progress) {
console.debug('Update:', progress);
});
然而,这不能按预期工作。页面已冻结,需要加载Items
的整个时间段。
有什么问题或者如何解决这个问题?
答案 0 :(得分:0)
解决方案是使用setTimeout
和递归函数,如下所示:
var counter = 0;
recursiveFunc: function(element) {
setTimeout(function() {
// Do stuff for element[counter]
if (++counter < numberOfElements) {
recursiveFunc(element);
}
}, 0);
}
recursiveFunc(element[counter])
UI线程仍然是错误的,但至少它没有被冻结。这个解决方案被选为快速解决方案。很长一段时间,我们决定优化代码以摆脱同步XHR请求。