Как я могу вернуть массив в javascript из функции?

Я работаю над получением функции для вывода массива, но ничего из того, что я делаю, не позволяет мне вернуть массив или получить доступ к массиву вне функции.

Я использую 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, насколько я могу судить, функция ничего не вернет.

Это, конечно, кажется простой проблемой, но я застрял на несколько часов. Как я могу создать функцию, которая будет возвращать массив, который я могу использовать в новой функции?

Предположительно, это let sql вместо et sql.

tadman 03.05.2019 19:41

Я полагаю, что это касается той же проблемы, но я также не знаю, ответило бы это на мой вопрос, если бы я столкнулся с ним. Итак, я предполагаю, что проблема та же самая, то, что я искал относительно решения проблемы, было не совсем то, что я понял. Тем не менее, знание этой статьи очень поможет в продвижении вперед.

worldwidejamie 03.05.2019 19:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
350
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это код, управляемый обратным вызовом, поэтому вы должны указать функцию обратного вызова для правильной цепочки:

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(...);

Да! Большое спасибо, что нашли время. Это был как раз тот кусок, который я не получил. Еще раз спасибо.

worldwidejamie 03.05.2019 19:51

Вы можете использовать обратный вызов, как предлагает @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;
}

Отличный пример, но здесь стоит отметить две вещи. Во-первых, многие библиотеки поддерживают как callback, так и promise методы вызова. Во-вторых, вы часто можете promisify функцию обратного вызова, чтобы сделать ее обещанием.

tadman 03.05.2019 21:07

Другие вопросы по теме