#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. мои извинения тоже. ничто не помогло :плакала: