从Promises异步更新DOM
async update DOM from Promises
我想通过我的承诺来更新DOM。我构建了一个承诺数组,并使用Promise.all:
运行它们。function test(i){
return Promise.resolve()
.then(function() {
// update the DOM
document.getElementById('progress').innerHTML += i;
return i;
});
}
var loadSequence = [];
// loop through all the frames!
for (var i = 0; i < 9999; i++) {
loadSequence.push(test(i));
}
Promise.all(loadSequence)
.then(function(){
window.console.log('all set...');
});
http://codepen.io/nicolasrannou/pen/jbEVwr 我无法让DOM实时更新。只有当我所有的承诺都解决了,它才会更新DOM。
这是预期的行为吗?如果是这样,我该如何利用诺言。来实时更新我的DOM ?
我想使用承诺而不是"setTimeout(function, 1000)"hack,但我找不到好的方法来做到这一点。
在浏览器中,DOM队列发生变化,如果它们连续发生,而主事件队列没有一些"空闲标记",就像你的for循环一样,它们将在JS操作DOM完成时立即应用。参见:https://stackoverflow.com/a/31229816/1207049
为了在浏览器环境中克服这个问题,您可以使用setTimeout
将代码执行块推送到不同的队列:
function test(i){
return Promise.resolve()
.then(function() {
// update the DOM
setTimeout(function() {
document.getElementById('progress').innerHTML += i;
}, 0);
return i;
});
}
如果没有setTimeout
,每个更新元素innerHTML的指令都被推到同一个队列的末尾。使用setTimeout,它总是进入一个新的空队列,并且可以在主队列中的项目之前执行。
相关文章:
- 如何确定Vue何时完成DOM更新
- DOM 更新问题
- ReactJS:如何从 DOM 更新 React
- 同一函数中的多个 DOM 更新
- Meteor JS渲染和DOM更新
- 简单的 AngularJS DOM 更新
- Safari:绝对定位的DIV在通过DOM更新时不会移动
- 任何视图模型dom更新的Knockout JS事件
- 使用DOM更新时不会触发输入文本事件
- 在Webkit中同步重绘/等待DOM更新
- 在不触发DOM更新的情况下更改URL
- Rails 3和Ajax/JSON/JQuery/直接DOM更新-与Scaffold程序一起使用
- 什么时候DOM更新完成,在javascript中添加子元素
- 羊驼javascript dom更新
- jQuery/Javascript -如何在继续执行函数之前等待被操纵的DOM更新
- 如何使用javascript和HTML DOM更新HTML元素的颜色?
- dojotoolkit中DOM更新有轻微延迟
- 暂停jQuery就绪事件,直到多个HTML DOM更新完成
- 严重的问题与后退按钮,Chrome和DOM更新
- 有没有一种编程方法来知道jQuery的DOM更新何时完成