承诺如何保证es6中的退货订单

时间:2018-02-11 21:11:22

标签: javascript ecmascript-6 promise axios

我正在使用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的特色吗?

1 个答案:

答案 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的规范定义。