Почему console.info () работает, но не array.push () в асинхронном коде?

У меня есть этот код, который пытается отслеживать все перенаправления, которые есть в 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 () работает не так, как ожидалось?

Вы продолжаете перезаписывать result, и после цикла while responses содержит кучу ссылок на один result. Вместо этого используйте, например, responses.push(JSON.stringify(result));.

Chris G 04.01.2019 10:16

Я не думаю, что проблема @ChrisG - он присваивает новое значение результату, а не изменяет объект результата - я придумал его код ... jsfiddle.net/jLparc9k ... работает как надо - я подозреваю, что код в вопросе не ' т именно код проблемы

Jaromanda X 04.01.2019 10:18

@JaromandaX Ты прав, дело не в этом.

Chris G 04.01.2019 10:21

@JaromandaX Мой комментарий был удален, так как я не видел, чтобы он касался Node.js. Так что не работает в Chrome или что-то еще.

Jeto 04.01.2019 10:21

@ChrisG, это работает с JSON.stringify (), спасибо

asanchez 04.01.2019 10:22

Я проверяю это в командной строке, а не в браузере, для всех, кто спросил

asanchez 04.01.2019 10:24

Убедитесь, что размещенный здесь код может воспроизвести проблему. То, что у вас есть в вопросе, не работает.

Chris G 04.01.2019 10:24

если JSON.stringify устраняет проблему, то опубликованный вами код не представляет реальный код, который вы используете.

Jaromanda X 04.01.2019 10:30

@JaromandaX да, извините, я попытался упростить код здесь. Я написал настоящий код

asanchez 04.01.2019 10:35

по-прежнему не имеет смысла, что вы получаете повторение последнего значения в массиве, хотя

Jaromanda X 04.01.2019 10:35
let newresponse = HttpResponse действительно нет создает ответ новый, но вместо этого повторно использует один и тот же объект HttpResponse снова и снова.
Bergi 04.01.2019 10:40

@Bergi, тогда почему console.info () работает правильно и всегда возвращает правильный ответ?

asanchez 04.01.2019 10:42

@antsanchez Поскольку вы всегда временно изменяете (единственный) объект, а затем регистрируете его

Bergi 04.01.2019 10:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
13
567
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я только что создал простой 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), а затем дать нам полный вывод?

Другие вопросы по теме