Переменная вне обратного вызова в NodeJS - PullRequest
1 голос
/ 17 сентября 2011

Я довольно новичок в NodeJS и в JavaScript в целом. Вот мой сценарий:

var data = [];

    client.query(

      'SELECT * FROM cds',
      function selectCb(err, results, fields) {

        if (err) {
          throw err;
        }

        console.log(results);
        console.log(fields);

        data.push(results);
      }
    );

    console.log(data);

Как получить доступ к переменной results (или data) вне функции обратного вызова? Я не хочу писать тонны обратных вызовов друг в друге при выполнении запросов.

Ответы [ 2 ]

1 голос
/ 17 сентября 2011

Node.js использует Стиль передачи продолжения для всех своих асинхронных интерфейсов.Существует много обсуждений вокруг этого и модулей , которые были созданы для облегчения боли вложенных обратных вызовов.Некоторое время ходили слухи, что node.js может начать заново вводить Promises в его ядро ​​в ветке v0.7.x, но я не уверен, правда это или нет.

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

var data = [],
    handler = function(err, results, fields) {
        if (err) {
          throw err;
        }
        ...
    };
client.query('SELECT * FROM cds', handler);
1 голос
/ 17 сентября 2011

То, что вы просите, - это синхронное (или блокирующее) выполнение, и это действительно противоречит дизайну и духу node.js.

Узел, как и JavaScript, является однопоточным. Если у вас есть код блокировки, то весь процесс останавливается .

Это означает, что вы должны использовать обратные вызовы для всего, что займет много времени (например, запрос из базы данных). Если вы пишете инструмент командной строки, который запускается за один проход, возможно, вы захотите жить с блокировкой. Но если вы пишете какое-либо адаптивное приложение (например, веб-сайт), блокировка - это убийство.

Так что возможно , что кто-то может дать вам ответ о том, как сделать этот синхронный вызов блокирующим. Если это так, и если вы реализуете это, вы делаете это неправильно. Вы также можете использовать многопоточный язык сценариев, такой как Ruby или Python.

Написание обратных вызовов не так уж и плохо, но требует некоторого размышления об архитектуре и упаковке способами, которые, вероятно, незнакомы людям, не привыкшим к стилю.

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