我正在使用ES6 JavaScript并进行依赖于返回顺序的API调用。 http客户端是Axios。一位同事指示我使用Promise.all([
axios.get('/cars'),
axios.get('/road-conditions')
]).then(values => {
this.cars = values[0]
this.roadConditions = values[1]
})
。它有效并且我知道它保证,但我不确定如何可以保证结果是有序的。我的理解是不能保证异步请求!我的简化代码是:
values
我想了解 driver.get(link)
driver.implicitly_wait(10)
如何知道哪个请求。这是Axios的特色吗?
答案 0 :(得分:4)
没有什么好处的技巧:Promise.all
只记住promise的索引并将该promise的结果保存到它构建的数组中的正确槽中。它不仅仅使用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;
}
这是axios的特殊功能吗?谢谢。
不,它由Promise.all
的规范定义。