Gett "Не удается прочитать свойство 0" при попытке получить доступ к точке массива - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь получить доступ к значению, установленному в функции в другой функции, затем я хочу вернуть это значение в конце, у меня есть console.log, чтобы показать значение, а журнал показывает значение просто отлично , но при попытке установить его я получаю сообщение об ошибке: TypeError: Cannot read property '0' of undefined

Кажется, что когда я пытаюсь вернуть значение (я делаю это, устанавливая функцию в качестве переменной), отображается функция без результата. Не знаете, как я могу показать результат из моей функции setValue, есть идеи? :) Мой экспресс-код:

function showBalance(cardNumber) {
  connection.query(
    "SELECT Balance from userCards WHERE CardNumber  = '" + cardNumber + "'",
    function(err, rows) {
      if (err) {
        throw err;
      } else {
        setValue(rows);
      }
    }
  );
  function setValue(value) {
    console.log('Balance object is:', value[0].Balance);
    const ownBalance = value[0].Balance;
    console.log('The user balance is: ', ownBalance);
    return ownBalance;
  }
  const returnBalance = setValue();
  return returnBalance;
}
module.exports = showBalance;

1 Ответ

0 голосов
/ 07 ноября 2018

В строке const returnBalance = setValue() вы вызываете setValue с 0 аргументами. Это приведет к сбою сценария, так как вы не можете сделать value[0], когда значение не определено.

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

  • Передайте функцию в качестве аргумента вашей внешней функции, которая представляет, что должно произойти после срабатывания обратного вызова. Вы вызываете эту функцию из обратного вызова и передаете ей значение. Это называется продолжением стиля передачи.

  • Используйте API, который поддерживает Обещания, и пусть ваша внешняя функция возвращает Обещание, содержащее значение вместо самого значения. Вы можете адаптировать API на основе обратного вызова к обещаниям, используя promisify: https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original

  • Используйте async / await, чтобы написать свой асинхронный код в стиле, очень похожем на синхронный код. Он также использует Promises под капотом, поэтому он требует совместимого API или Promisify, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...