Функции обещания. тогда работают только если определены внутри - PullRequest
0 голосов
/ 07 апреля 2020

Есть кое-что, что я действительно не понимаю из обещаний. Это случалось со мной и с обратными вызовами. Я не знаю, что я не вижу. Когда я определяю функцию внутри "promise.then", она работает правильно. Но когда я определяю ту же функцию с тем же параметром снаружи, он говорит, что параметр не определен. Что тут происходит? Есть другой способ получить более чистый код?

Я публикую код, который использует express и топор ios npm, но я не думаю, что это проблема.

app.get('/', function(req, res) {
    //enviamos un mensaje a auth
    axios
        .post('http://localhost:8081', {
            mensaje : 'Empiezo en api-rest.'
        })
        .then(function(response) {
            //Ahora tengo que enviar la respuesta a priv
            axios
                .post('http://localhost:8082', response.data)
                .then(function(responsePriv) {
                    console.log(responsePriv);
                })
                .catch(function(error) {
                    console.log(error);
                });
        })
        .catch(function(error) {
            console.log(error);
        });
});

Второй код

app.get('/', function(req, res) {
    //enviamos un mensaje a auth
    axios
        .post('http://localhost:8081', {
            mensaje : 'Empiezo en api-rest.'
        })
        .then(respuestaDeAuth(response))
        .catch(function(error) {
            console.log(error);
        });
});

function respuestaDeAuth(response) {
    //Ahora tengo que enviar la respuesta a priv
    axios
        .post('http://localhost:8082', response.data)
        .then(function(responsePriv) {
            console.log(responsePriv);
        })
        .catch(function(error) {
            console.log(error);
        });
}

1 Ответ

2 голосов
/ 07 апреля 2020

Вам не нужно передавать ответ,

app.get('/', function(req, res) {
    //enviamos un mensaje a auth
    axios
        .post('http://localhost:8081', {
            mensaje : 'Empiezo en api-rest.'
        })
        .then(respuestaDeAuth) // <-- Don't call your callback. Just pass it
        .catch(function(error) {
            console.log(error);
        });
});

, когда вы добавляете функцию then(respuestDeAuth(response)), respuestDeAuth, немедленно выполняемую с неопределенным ответом на вызов переменной. Вот почему его ответное слово не определено.

Вы можете провести небольшой эксперимент, чтобы понять это, объявив переменную во внешней лексической среде, например, const response = "Some data". Затем прокомментируйте запрос топора ios и попробуйте console.log() response. На этот раз вы не увидите ошибку, вместо этого вы увидите значение response variable

EDIT

А если вы хотите добавить параметр res,

 app.get('/', function(req, res) {
        //enviamos un mensaje a auth
        axios
            .post('http://localhost:8081', {
                mensaje : 'Empiezo en api-rest.'
            })
            .then(() => respuestaDeAuth(res))
            .catch(function(error) {
                console.log(error);
            });
    });

Единственное, что вам нужно, это НЕ вызывать функцию обратного вызова. Здесь я использовал функцию и внутри этой функции я вызвал respuestaDeAuth() с исходным res объектом.

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