来自 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。
这是预期的行为吗?如果是这样,我如何利用 Promise.all 实时更新我的 DOM?
我想使用 promises 而不是 "setTimeout(function, 1000)" hack,但我找不到好的方法。
在浏览器中,DOM 队列会发生变化,如果它们连续发生而主事件队列没有一些 "free ticks" 就像您使用 for 循环的情况一样,它们将在一旦 JS 操作 DOM 完成。参见:
为了在浏览器环境中解决这个问题,您可以使用 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,它总是进入一个新的空队列,并且可能在主队列中的项目之前执行。
我想通过我的承诺更新 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。
这是预期的行为吗?如果是这样,我如何利用 Promise.all 实时更新我的 DOM?
我想使用 promises 而不是 "setTimeout(function, 1000)" hack,但我找不到好的方法。
在浏览器中,DOM 队列会发生变化,如果它们连续发生而主事件队列没有一些 "free ticks" 就像您使用 for 循环的情况一样,它们将在一旦 JS 操作 DOM 完成。参见:
为了在浏览器环境中解决这个问题,您可以使用 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,它总是进入一个新的空队列,并且可能在主队列中的项目之前执行。