Функция вернет null из javascript post/get

Новый для JavaScript и только начал читать о Callback и Promise. Я просто не понимаю понятия "ждать", пока не получаю значение из запроса POST/GET.

Более конкретно, почему это не будет работать?

var token = null;

/
/ var options = {headers, form, etc}
/

function getToken() {

    request(options)
        .then(function (parsedBody) {
            this.token = parsedBody
        })
        .catch(function (err) {
                console.log('POST-Error')
    })

    return token
}

console.log(getToken())

Я использую `request-prom 'lib в nodejs. Как я понимаю, когда вызывается запрос, тогда переменная токена будет установлена ​​с момента ее обещания, верно?

Ответ 1

Это сложно, и я не обвиняю вас в том, что вы в замешательстве. Все, кто новичок в Node, похоже, запутались в этом.

Ваша проблема заключается в том, что переменная будет изменена правильно - только пока не выполняется console.log().

Когда функция возвращает обещание, это означает, что что-то произойдет в будущем - возможно, в одно мгновение, возможно, позже, но еще не в то время, когда эта функция возвращает обещание.

Затем вы можете добавить обработчиков выполнения и отклонения к обещанию - эти обработчики будут вызваны, когда обещание будет фактически разрешено (т.е. есть некоторые данные, возвращаемые запросом, или есть ошибка).

Итак, вы не можете написать:

console.log(getToken());

Что вы можете написать:

getToken()
    .then(data => console.log('Data:', data))
    .catch(error => console.log('Error:', error));

Но только когда вы действительно вернете обещание от своей функции:

function getToken() {
    let promise = request(options);
    return promise;
}

Теперь вы можете использовать ключевое слово async и сделать что-то вроде этого:

async function getToken() {
    let data = await request(options);
    return data;
}

но эта функция не возвращает data - она ​​возвращает обещание точно так же, как в предыдущем примере.

Помните одно, что вы не можете вернуть какое-либо значение из вашей функции, которая пока недоступна. Вы можете вернуть обещание только в том случае, если хотите вернуть что-то еще до его появления. И каждая асинхронная функция - будь то async function, функция, которая явно возвращает обещание или функцию, которая выполняет обратный вызов, вернется до того, как будет выполнено асинхронное действие, без блокировки потока.

Подробнее см. некоторые из этих ответов: