Перехватчик Axios setTimeout() работает в разработке, но не после компиляции и развертывания

#javascript #promise #axios

Вопрос:

У меня есть задержка, встроенная в мой axios модуль для тестирования react блесен пользовательского интерфейса и т. Д.

Mock_delay отлично работает на моей локальной машине, но после того, как я npm build и разверну его, кажется, что обещание не возвращается.

Если я установлю значение mock_delay false, это будет работать как на моей локальной, так и на удаленной (встроенной, nginx) машине. Но если я установлю тайм-аут, то на встроенном сервере я увижу «console.log(‘config.mock_delay’ и т. Д.», Но не «console.log(«ответ», ответ)».

Есть какие-нибудь зацепки??

 
const Server = axios.create({
    baseURL: AUTH_API2_URL,
    timeout: 5000,
    mock_delay: false, //800,
    headers: {
      'Authorization': currentJWTHeader(),
      'Content-Type': 'application/json',
      'accept': 'application/json'
    }
  })

Server.interceptors.request.use((config) => {
  if (config.mock_delay) {
    console.log('config.mock_delay', config.mock_delay)
    return new Promise(resolve =>
      setTimeout(() => resolve(config), config.mock_delay))
  }
  return config
})

Server.interceptors.response.use(
  response => {
    console.log('response', response)
    return response
  }
}

 

Ответ №1:

Я не знаю, как работает ваша локальная версия, но для производства у нее есть причина не работать.

1-й, перехватчику axios use требуется функция с такой сигнатурой: req => req . Это означает получение запроса и возврат расширенного запроса. Ссылка здесь:

https://axios-http.com/docs/interceptors

https://masteringjs.io/tutorials/axios/interceptors

Так что с вашим кодом это правильно mock_delay , когда false : config => config

Но когда mock_delay это не false так , это так config => Promise , то ваш код не удался из-за неправильного ожидания => вот почему вы никогда не видите > response .

Давайте немного покрутим:

 function delay(ms) {
    // my prev answer has a mistake
    // that is the `resolve` function is undefined
    // return new Promise((resolve) => setTimeout(resolve, ms));
    // fix here
    return new Promise(() => setTimeout(() => {}, ms));
}

// remember to add async keywork
Server.interceptors.request.use(async (config) => {
  if (config.mock_delay) {
    console.log('config.mock_delay', config.mock_delay)
    // with await, this will wait for the time of mock_delay
    await delay(config.mock_delay)
  }

  // finally still return config
  return config
})
 

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

1. Спасибо, что попытался @Khoa ! Я дал этому, но, к сожалению, совершенно то же самое. Я даже попытался уменьшить задержку до 20 мс, но она все равно дошла только до печати сообщения консоли 🙁

2. @ErichBSchulz, я думаю, что совершил ошибку — resolve функция не определена. Давайте попробуем это: javascript function delay(ms) { return new Promise(() => setTimeout(()=>{}, ms)); }

3. извини, Хоа — я попробовал это, но без изменений. Снова работает локально, но при сборке и развертывании, как только я устанавливаю mock_delay, он умирает. Я думаю, что это должно быть как-то связано с процессом сборки??

4. на самом деле нет, ваша обновленная функция задержки вообще не работала ни на сервере, ни на локальной машине (извините)

5. мои извинения тоже. ничто не помогло :плакала: