Почему console.log () работает, но не array.push () в асинхронном коде? - PullRequest
0 голосов
/ 04 января 2019

У меня есть этот код, который пытается отследить все перенаправления 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.log(result)
    responses.push(result)

    while( result.final != true ){
        result = await doCall(result.response.headers.location)
        console.log(result)
        responses.push(result)
    }

    console.log(responses)
}

start()

Вывод каждого файла console.log, кроме последнего, использующего URL с перенаправлением 301:

{final: false, ...}
{final: true, ...}

Вывод файла console.log (ответы):

[{final: true, ...}
{final: true, ...}]

Почему response.push () не работает должным образом?

1 Ответ

0 голосов
/ 04 января 2019

Я только что создал простой 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.log(result)
    responses.push(result)

    while( result.final != true ){
        result = await doCall()
        console.log(result)
        responses.push(result)
        i++;
    }

    console.log(responses)
}

start();

Возможно, есть и другая проблема, чем вы думаете, есть ли еще код, который вы можете предоставить?Можете ли вы скопировать полный вывод вашего кода?(т.е. запустить его с node server.js > output.txt), а затем дать нам полный вывод?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...