Реагируйте на собственные запущенные параллельные Axios / запрос на извлечение

#react-native #axios #fetch

Вопрос:

Фон:

У меня есть собственный проект React, который должен вызывать несколько API одновременно (но на разных экранах). Вот упрощенный код.

 callAPI(method, address, data, callback) {
    console.log("Calling... ", address)

    axios({
      method: method,
      url: address,
      headers: {
        Accept: "text/html",
        "Content-Type": "multipart/form-data"
      },
      data: data
    })
      .then(resp => {
        console.log("Done... ", address)  

        callback(resp.data)
      })
      .catch(err => {
        callback({
          statusCode: 500,
          errCode: "axios error",
          errmsg: err.message
        })
      })
}


this.callAPI('GET', firstURL, null, callback) // Say, this takes 10 seconds to finish
this.callAPI('GET', secondURL, null, callback) // This takes 1 second
 

В идеале API secondURL должен возвращать результат независимо от того, завершен ли API firstURL. Однако это не так. Он будет ждать завершения API firstURL, прежде чем возвращать результат secondURL.

Я попытался использовать Axios или fetch, но оба они ждут завершения другого вызова API.

Я в замешательстве, потому что я думал, что Axios и fetch основаны на обещаниях?

Вопрос:
Как выполнить два или более параллельных вызова API в React Native?

записка:
Я не могу использовать Обещание.все потому, что мне не нужно вызывать эти API вместе.

Обновить:

  • Я также выяснил, что если базовый URL API отличается, он будет работать так, как задумано. (например, один из них https://www.test.com а другой-это https://test.com)
  • Я почти уверен, что это проблема с React Native, если я попробую тот же код на jsfiddle.net, все работает так, как задумано

Комментарии:

1. Если вы называете их оба друг за другом, и вы ничего не ждете, они должны работать параллельно. Если это не так, вам придется поделиться большим количеством кода.

2. @Evert Я обновил свой вопрос с помощью метода callAPI

3. Обычно код, которым вы делились, не ждал бы друг друга. Проблема должна заключаться в чем-то, не связанном с кодом, которым вы поделились.

4. @Evert дело в том, что, когда я вызываю оба API, вызов… строка выполняется одновременно. Однако дело Сделано.. очередь будет ждать друг друга. Я почти уверен, что это все коды, в которых есть проблема. Я не использую асинхронное ожидание в коде.

5. Отображаются ли оба запроса сразу на вкладке «Сеть» вашего браузера?

Ответ №1:

Как указал Эверт, это проблема с сервером. Сервер блокировал другие API, которые должны были выполняться одновременно.

Ответ №2:

Попробуйте изучить createAsyncThunk и обработать ваши сетевые запросы с помощью Redux. Это немного сложная тема, поэтому я бы изучил Redux самостоятельно, но в целом стратегия заключается в том, чтобы отправлять действия, соответствующие вашей функции callAPI, а затем сохранять их результаты в состоянии вашего приложения. Часть красоты AsyncThunks заключается в том, что у вас есть доступ к методам жизненного цикла асинхронных вызовов (ожидающих, выполненных, отклоненных).