实现promise.all 但是效果并不如期望那样
var makePromise = function(value, time) {
return new Promise(function(resolve, reject){
setTimeout(function() {
resolve(value);
}, time)
})
};
function order1(promiseList) {
return new Promise((resolve, reject) => {
let result = [];
let i = 0;
for (let p in promiseList) {
promiseList[p].then(value => {
result[p] = value
i++;
console.log(value);
if (i === promiseList.length) {
resolve(result);
}
return Promise.resolve(value)
}, reject);
}
});
}
order1([
makePromise('a', 3000),
makePromise('b', 1000),
makePromise('c', 2000),
]).then(v=>{
console.log(v);
})
在for循环的console.log中 data返回的是b,c,a 并不如期望的a,b,c 有大神指导下如何修改吗 这是一道面试题 使用递归的方法在then中打印data 是 延迟之后同时输出abc 在循环中则是每间隔1秒 输出bca
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
用同步循环的话顺序不会变,各
Promise
之间没有影响,要强制把他们的resolve
顺序改变,比较直观的方法是用递归:同步循环(指没有 await 的循环)也可以做到与
Promise.all
规范一致:但是如果在
.then
中打印的话,打印顺序和他们在数组中的顺序是不一致的。makePromise
的第二个参数是延迟时长吗?如果是的话那么 Promise 完成的顺序确实是b、c、a,then
中console.log
依次输出 b、c、a 是正常现象。Promise.all
需要保证的是全部完成后输出的结果保持原有顺序。