JavaScript функция не передает значение переменной

Есть функция, почему переменная s стала undefined?

let s;
async function getId() {
    const instance = await axios.create({

        headers: {
            'Content-Type': 'application/json;charset=utf-8',
            'Authorization': 'Bearer ' + token,
            'fields': 'id,login,name,email'
        }
    });
    instance.get(proxyurl + url)
        .then(response => {

            for (let i = 0; i < response.data.length; i++) {
                s = response.data[0].id
                console.log(s)
                return s;
            }

        })

}
getId().then(as(s));

function as(s) {
    console.log(s)

}
as(s)

Ответы (3 шт):

Автор решения: webDev_

Переменные созданные внутри функции остаются внутри функции. А let и вовсе остаётся, грубо говоря, внутри любых фигурных скобок где был объявлен.

Это называют областью видимости

Переменную можно заготовить заранее придав ей видимость вне функции.

Вторая ошибка состоит в том что в as не передаются аргументы.

let s;

async function getId() {
    const instance = await axios.create({

        headers: {
            'Content-Type': 'application/json;charset=utf-8',
            'Authorization': 'Bearer ' + token,
            'fields': 'id,login,name,email'
        }
    });
    instance.get(proxyurl + url)
        .then(response => {

            for (let i = 0; i < response.data.length; i++) {
                s = response.data[0].id
                console.log(s)
                return s;
            }

        })

}
getId();

function as(s) {
    console.log(s)

}
as(s)
→ Ссылка
Автор решения: Doofy

Раз вызывается асинхронная функция, то нужно и ждать ответа от этой функции прежде, чем вызывать другую

async function getId() {

  let s = 'qeqqe';
  return s;
}

function as(s) { console.log(s); }

getId().then(as);


В вашем примере сначала вызывается getId(), затем сразу вызывается функция as() с пустым аргументом, именно поэтому s - undefined.

return s возвращает s в getId() уже после вызова as()


async function getId() {

    let s;

    const instance = await axios.create({
        headers: {
            'Content-Type': 'application/json;charset=utf-8',
            'Authorization': 'Bearer ' + token,
            'fields': 'id,login,name,email'
        }
    });

    instance.get(proxyurl + url).then(response => {

        for (let i = 0; i < response.data.length; i++) {
            s = response.data[0].id
            console.log(s)
        }
    });

    return s;
}

getId().then(as);

function as(s) {

    console.log(s);
}

Можно использовать callback

(async function(callback) {

    const instance = await axios.create({

        headers: {
            'Content-Type': 'application/json;charset=utf-8',
            'Authorization': 'Bearer ' + token,
            'fields': 'id,login,name,email'
        }

    }).get(proxyurl + url).then(response => callback(response.data));

})(as);

function as(json) {

    json.forEach(item => console.log(item.id));
}
→ Ссылка
Автор решения: vsemozhebuty

В вашем коде есть несколько неувязок:

  1. Вы используете асинхронную функцию, но не возвращаете из неё ничего, поэтому по умолчанию она возвращает Promise, который разрешается в undefined. Вам стоило поставить return перед instance.get(), чтобы потом ожидалась вся цепочка промисов.

  2. Вы зачем-то используете цикл и возвращаете значение из первой же итерации, сразу прерывая цикл. Если вам нужно вернуть несколько значений, возвращайте массив. Если одно, не используйте цикл.

  3. then(as(s)) — в then() нужно передавать функцию, а вы вместо этого вызываете функцию и передаёте её возвращаемое значение, то есть тоже undefined.

  4. Обычно советуют не смешивать async/await и обычные методы промисов типа then. Внутри async функции используйте await. Попробуйте так (если вам нужно вернуть одно значение):

async function getId() {
    const instance = await axios.create({
        headers: {
            'Content-Type': 'application/json;charset=utf-8',
            'Authorization': 'Bearer ' + token,
            'fields': 'id,login,name,email'
        }
    });
    const response = await instance.get(proxyurl + url);
    const s = response.data[0].id;
    return s;
}

getId().then((s) => { as(s); });

function as(s) {
    console.log(s)
}
→ Ссылка