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 шт):
Переменные созданные внутри функции остаются внутри функции. А 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)
Раз вызывается асинхронная функция, то нужно и ждать ответа от этой функции прежде, чем вызывать другую
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));
}
В вашем коде есть несколько неувязок:
Вы используете асинхронную функцию, но не возвращаете из неё ничего, поэтому по умолчанию она возвращает Promise, который разрешается в
undefined. Вам стоило поставитьreturnпередinstance.get(), чтобы потом ожидалась вся цепочка промисов.Вы зачем-то используете цикл и возвращаете значение из первой же итерации, сразу прерывая цикл. Если вам нужно вернуть несколько значений, возвращайте массив. Если одно, не используйте цикл.
then(as(s))— вthen()нужно передавать функцию, а вы вместо этого вызываете функцию и передаёте её возвращаемое значение, то есть тожеundefined.Обычно советуют не смешивать
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)
}