У меня есть этот код, который пытается отслеживать все перенаправления, которые есть в URL-адресе. Console.log () выводит все правильно для отдельных ответов, но когда я пытаюсь вывести результат response.push (), он просто выводит X раз тот же вывод.
Я использую Node v8.12 и Axios 0.18
const axios = require('axios')
const instance = axios.create({
maxRedirects: 0
})
var HttpResponse = {
status: '',
statusText: '',
location: '',
headers: {}
}
let url = 'url with redirects here'
const doCall = async function(url){
return instance.get(url)
.then((response) => {
let newresponse = HttpResponse
newresponse.status = response.status
newresponse.statusText = response.statusText
newresponse.headers = response.headers
return {
final: true,
response: newresponse
}
})
.catch((err) => {
if ( err.response ){
let newresponse = HttpResponse
newresponse.status = err.response.status
newresponse.statusText = err.response.statusText
newresponse.headers = err.response.headers
return {
final: false,
response: newresponse
}
}else{
let newresponse = HttpResponse
return {
final: true,
response: newresponse
}
}
})
}
const start = async function(){
let responses = []
let result = await doCall(url)
console.info(result)
responses.push(result)
while( result.final != true ){
result = await doCall(result.response.headers.location)
console.info(result)
responses.push(result)
}
console.info(responses)
}
start()
Вывод каждого console.info, кроме последнего, с использованием URL-адреса с перенаправлением 301:
{final: false, ...}
{final: true, ...}
Вывод console.info (ответы):
[{final: true, ...}
{final: true, ...}]
Почему response.push () работает не так, как ожидалось?
Я не думаю, что проблема @ChrisG - он присваивает новое значение результату, а не изменяет объект результата - я придумал его код ... jsfiddle.net/jLparc9k ... работает как надо - я подозреваю, что код в вопросе не ' т именно код проблемы
@JaromandaX Ты прав, дело не в этом.
@JaromandaX Мой комментарий был удален, так как я не видел, чтобы он касался Node.js. Так что не работает в Chrome или что-то еще.
@ChrisG, это работает с JSON.stringify (), спасибо
Я проверяю это в командной строке, а не в браузере, для всех, кто спросил
Убедитесь, что размещенный здесь код может воспроизвести проблему. То, что у вас есть в вопросе, не работает.
если JSON.stringify устраняет проблему, то опубликованный вами код не представляет реальный код, который вы используете.
@JaromandaX да, извините, я попытался упростить код здесь. Я написал настоящий код
по-прежнему не имеет смысла, что вы получаете повторение последнего значения в массиве, хотя
let newresponse = HttpResponse действительно нет создает ответ новый, но вместо этого повторно использует один и тот же объект HttpResponse снова и снова.
@Bergi, тогда почему console.info () работает правильно и всегда возвращает правильный ответ?
@antsanchez Поскольку вы всегда временно изменяете (единственный) объект, а затем регистрируете его



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я только что создал простой POC вашего кода, чтобы его можно было запускать без особых требований, и он работает как шарм.
let i=0;
const doCall = async function(url){
return Promise.resolve()
.then((response) => {
if (i > 4) {
return {final: true};
}
return { final: false};
})
}
const start = async function(){
let responses = []
let result = await doCall()
console.info(result)
responses.push(result)
while( result.final != true ){
result = await doCall()
console.info(result)
responses.push(result)
i++;
}
console.info(responses)
}
start();Вероятно, существует какая-то другая проблема, чем вы думаете, можете ли вы предоставить еще код? Можете ли вы скопировать полный вывод вашего кода? (т.е. запустить его с node server.js > output.txt), а затем дать нам полный вывод?
Вы продолжаете перезаписывать
result, и после цикла whileresponsesсодержит кучу ссылок на одинresult. Вместо этого используйте, например,responses.push(JSON.stringify(result));.