Я работаю над получением функции для вывода массива, но ничего из того, что я делаю, не позволяет мне вернуть массив или получить доступ к массиву вне функции.
Я использую node.js и mysql и пытаюсь извлечь данные строки, изменить их, а затем поместить в массив. Кажется, я могу поместить его в массив, потому что внутри функции я могу console.info переменную, для которой я установил массив, и я получаю то, что ищу. Но я не могу получить его из массива. Сначала я использовал forEach(), но перешел на использование map().
В настоящее время я нахожусь здесь:
let sql = "SELECT invoice FROM subscriptions";
myFunction = () => {
con.query(sql, (err, rows) => {
if (err) throw err;
var newArray = rows.map((row) => {
return row.invoice;
})
console.info(newArray)
})
}
myFunction();
Если я заменю console.info(newArray) на return newArray, похоже, не будет никаких доказательств того, что это дает мне то, что я ищу.
Я также пытался определить переменную вне функции, а затем установить newArray в переменную вне функции:
let sql = "SELECT invoice FROM subscriptions";
myArray = []
myFunction = () => {
con.query(sql, (err, rows) => {
if (err) throw err;
var newArray = rows.map((row) => {
return row.invoice;
})
myArray = newArray
})
}
myFunction();
console.info(myArray)
Это приводит только к []
В этом коде rows возвращает номера счетов из таблицы подписок. Результат:
[ '23480-13',
'23354-14',
'23728-14',
'23614-16',
'16132-14',
... more results ]
Итак, console.info внутри функции кажется правильным. Но если я попытаюсь вернуть newArray, насколько я могу судить, функция ничего не вернет.
Это, конечно, кажется простой проблемой, но я застрял на несколько часов. Как я могу создать функцию, которая будет возвращать массив, который я могу использовать в новой функции?
Я полагаю, что это касается той же проблемы, но я также не знаю, ответило бы это на мой вопрос, если бы я столкнулся с ним. Итак, я предполагаю, что проблема та же самая, то, что я искал относительно решения проблемы, было не совсем то, что я понял. Тем не менее, знание этой статьи очень поможет в продвижении вперед.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это код, управляемый обратным вызовом, поэтому вы должны указать функцию обратного вызова для правильной цепочки:
function myFunction(cb) {
// Supply your query directly to query() so you don't accidentally
// send the wrong query by using an incorrect or undefined variable.
con.query("SELECT invoice FROM subscriptions", (err, rows) => {
// NOTE: This function runs at some point in the unspecified future,
// but you can request a callback when it's done.
if (err) throw err;
let newArray = rows.map((row) => {
return row.invoice;
})
cb(newArray);
})
}
myFunction(myArray => {
console.info(myArray);
});
Без правильной последовательности ничто в вашем коде JavaScript не будет выполняться в нужное время.
Обратите внимание, что использование промисов помогает значительно упростить код такого типа, поскольку вы можете сделать это в основном следующим образом:
let myArray = await con.query(...);
Да! Большое спасибо, что нашли время. Это был как раз тот кусок, который я не получил. Еще раз спасибо.
Вы можете использовать обратный вызов, как предлагает @tadman, но я бы посоветовал вам использовать Promise. Использование Promise позволяет другим функциям вызывать эту с помощью await.
Обещанная версия:
function myFunction() {
return new Promise(
(resolve, reject) => {
con.query("SELECT invoice FROM subscriptions", (err, rows) => {
if (err) {
reject(err);
}
resolve(rows.map(row => row.invoice));
})
}
);
}
myFunction().then(myArray => {
console.info(myArray);
});Если вы находитесь в другой функции, вы можете вызвать myFunction с помощью await:
async function getData() {
myArray = await myFunction();
console.info(myArray);
return myArray;
}
Предположительно, это
let sqlвместоet sql.