这个问题已经在这里有了答案: > Promise.all: Order of resolved values 3个
我正在使用ES6 JavaScript,并进行依赖于返回顺序的API调用. http客户端是Axios.一位同事指示我使用Promise.all().它可以工作,我知道可以保证,但是我不确定如何保证结果正确.我的理解是不能保证异步请求!我的简化代码是:
Promise.all([
axios.get('/cars'),
axios.get('/road-conditions')
]).then(values => {
this.cars = values[0]
this.roadConditions = values[1]
})
我想了解值如何知道哪个请求是哪个.这是Axios的特殊功能吗?
解决方法:
它没有什么绝招:Promise.all只记住诺言的索引并将该诺言的结果保存到它构建的数组中的正确插槽中.它不仅使用push来构建数组(因为这确实很混乱).
function randomDelay(val) {
return new Promise(resolve => {
setTimeout(function() {
console.log("Resolving " + val);
resolve(val);
}, Math.random() * 1000);
});
}
function fakeAll(promises) {
let waitingFor = promises.length;
const results = [];
return new Promise((resolve, reject) => {
for (let i = 0; i < promises.length; ++i) {
// ^^^--- let, not val (it's important)
promises[i].then(val => {
results[i] = val; // <=== Notice use of 'i'
if (--waitingFor === 0) {
resolve(results);
}
}).catch(reject);
}
});
}
fakeAll([
randomDelay("one"),
randomDelay("two"),
randomDelay("three"),
randomDelay("four"),
randomDelay("five")
]).then(results => {
console.log(results);
});
.as-console-wrapper {
max-height: 100% !important;
}
Is this a special feature with axios? Thank you.
不,它是由Promise.all规范定义的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。