【发布时间】:2017-02-05 07:54:12
【问题描述】:
我可以用Promise.all(array) 异步解决一堆promise。然而.then() 只会在所有这些承诺都得到解决后运行。当承诺得到解决时,我如何执行操作?
例如,我想使用 Promise.all() 异步加载文章中的所有段落 - 这样网络请求会立即全部触发。如果第 1 段完成加载,我希望它呈现到页面 - 但只有在第 2 段之前完成加载,然后我希望第 2 段加载。如果第 3 段已完成加载而第 2 段未加载,我希望 3 在渲染到页面之前等待 2。以此类推。
我尝试了类似的方法,但我不知道下一步该做什么:
var getStuff = function(number, time){
return new Promise(function(resolve, reject){
window.setTimeout(function(){resolve(`${number} - Done.`)}, time);
});
};
Promise.all([ getStuff(1, 200),
getStuff(2, 100),
getStuff(3, 250),
getStuff(4, 200),
getStuff(5, 300),
getStuff(6, 250),
getStuff(7, 5000)])
.then(function(data){
console.log(data);
});
我怎样才能让数据的控制台日志一个接一个地发生 - 在发出下一个请求之前,不用then() 解决每个承诺?有没有更好的方法来做到这一点?
【问题讨论】:
-
一些 Promise 库有 progress 回调。
-
没有办法使用原生 es6 获得这种行为?不向我的项目添加另一个库?
-
为什么不为每个承诺只渲染
getStuff(...)和then? -
我不认为它是本地可用的。不过,您仍然可以拥有一系列承诺,并且每个承诺都有一个单独的
then()。 -
@nem035 哦,我错过了那部分。
标签: javascript asynchronous promise ecmascript-6