Dojo: async调用setTimeout + Deferred——>不工作
Dojo: async call with setTimeout + Deferred --> not working
想象页面上有一个Dashboard
和一些Items
。当页面加载时,我们希望这样处理它:
- 加载并渲染
Dashboard
。 - 使用async call (
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
加载的整个过程中被冻结。
有什么问题或如何处理的建议吗?
解决方案是使用setTimeout
和递归函数,像这样:
var counter = 0;
recursiveFunc: function(element) {
setTimeout(function() {
// Do stuff for element[counter]
if (++counter < numberOfElements) {
recursiveFunc(element);
}
}, 0);
}
recursiveFunc(element[counter])
UI线程仍然会有bug,但至少它没有被冻结。这个解决方案被选为快速解决方案。长期以来,我们决定优化代码以摆脱同步XHR请求。
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 正在尝试使用if和else添加类,但无法正常工作
- Jquery FadeIn FadeOut 只工作一次
- Foreach无法在Typescript中工作
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- JS可以在Chrome中工作,但不能在Firefox中工作
- ajaxToolkit PopupControlExtender不工作.过时的
- Dojo: async调用setTimeout + Deferred——>不工作
- ECMAScript的承诺.all方法与jQuery.Deferred一起工作.为什么