Javascript 如何同时调用api?

Javascript 如何同时调用api?,javascript,es6-promise,Javascript,Es6 Promise,我有一个异步函数,它可以同时调用我的API,但承诺.all()将在大约2秒钟后解析(一个请求在大约200毫秒内解析)。这意味着我的请求一个接一个地解析,而不是同时解析,即使它们是异步启动的 // don't run in client side of browser - CORS async asyncData () { axios.interceptors.request.use(config => { console.log('Start: ', n

我有一个异步函数,它可以同时调用我的API,但承诺.all()将在大约2秒钟后解析(一个请求在大约200毫秒内解析)。这意味着我的请求一个接一个地解析,而不是同时解析,即使它们是异步启动的

// don't run in client side of browser - CORS
    async asyncData () {
      axios.interceptors.request.use(config => {
        console.log('Start: ', new Date)
        return config
      })
      const promise1 = axios.get('https://jsonplaceholder.typicode.com/comments')
      const promise2 = axios.get('https://jsonplaceholder.typicode.com/posts')
      const promise3 = axios.get('https://jsonplaceholder.typicode.com/todos')
      const promise4 = axios.get('https://jsonplaceholder.typicode.com/users')
      const promise5 = axios.get('https://jsonplaceholder.typicode.com/photos')
      const promise6 = axios.get('https://jsonplaceholder.typicode.com/photos')
      const promise7 = axios.get('https://jsonplaceholder.typicode.com/photos')
      const promise8 = axios.get('https://jsonplaceholder.typicode.com/photos')
      const promise9 = axios.get('https://jsonplaceholder.typicode.com/photos')
      await Promise.all([
        promise1,
        promise2,
        promise3,
        promise4,
        promise5,
        promise6,
        promise7,
        promise8,
        promise9,
      ]).then(data => {
        console.log('End: ', new Date)
      })
    }
我很困惑,因为下面的代码在4000毫秒内解析,这意味着它们同时启动,并在最大超时-4000结束后解析。这一次承诺不会连锁反应

    async asyncData () {
      function startTimer (time) {
        return new Promise(function (resolve) {
          setTimeout(function () {
            resolve()
          }, time)
        })
      }

      console.time('Timer')
      Promise.all([
        startTimer(1000),
        startTimer(4000),
        startTimer(2000),
      ]).then(function () {
        console.timeEnd('Timer')
      })
    }

顺便说一句,很抱歉英语不好“\_(ツ)_/“

您的代码很好。问题是,大量同时发生的网络请求,尤其是向同一端点发出的请求,通常比仅发出一个请求需要更长的时间才能解决-即使您并行发出所有这些请求。以下是Chrome devtools请求的屏幕截图:

正如您所看到的,所有请求都会立即被触发,但后续的请求需要更长的时间才能解决。这通常是由端点(此处,
jsonplaceholder
)限制请求造成的

如果您向自己的服务器发出请求,并且您的服务器和脚本源都有足够的带宽、连接性,并且没有限制,那么并行请求至少可以在几乎相同的时间解析


(浏览器可能会限制一次允许的连接总数,OSs也可能会限制)

Javascript是同步的和单线程的。@DrewReese但是异步函数和承诺需要什么呢?我就是不明白。我也尝试过使用/理解worker_线程,但仍然找不到解决方案浏览器对同时连接同一服务器的数量有限制,通常约为4。检查浏览器开发r工具“网络”选项卡,并观察实际情况happens@KitAliev它们允许同步单线程代码异步运行,即在主JS线程上无阻塞运行。请注意,当数组中的所有承诺都解析时,Promise.all会解析,但不能保证它们的处理或解析顺序。在fir中例如,10x网络请求在~200ms内解决每个问题的时间等于2秒,因为正如其他人指出的那样,浏览器/网络似乎存在外部交互,而在第二个例子中,计时器是立即设置的,最长的4秒将在Promise.all解决问题时占主导地位。在其他情况下,如果您的服务器真的是瓶颈,请购买一个m我认为是一个更强大的服务器。但在这里,瓶颈似乎在jsonplaceholder上,而不是在服务器的网络能力上。如果您想要更快的响应,您可以尝试通过一个单独的脚本发出一半的请求,该脚本从不同的外部IP发出请求,或者类似的东西。谢谢您的回答。我的请求运行在n服务器[NodeJS | Express]如何增加总数?请参见上面的评论(1)瓶颈不是您的服务器,而是您连接的端点(2)即使瓶颈是您的服务器,升级也可能涉及与提供商的网络连接设置,而不是物理机器规格