Проблема с областью JavaScript - PullRequest
0 голосов
/ 04 ноября 2010

У меня есть следующий фрагмент javascript, но по некоторым причинам «имена», возвращаемые из myfunc, пусты.

var myfunc = function(client, id) {
  var names = new Array();
  client.query(
    'SELECT stuff FROM mytable WHERE id="'+id+'"',
    (function selectCb(err, results, fields) {
      if (err) {
        throw err;
      }
      for (result in results) {
        // This prints fine
        console.log(results[result].name);
        names[result] = results[result].name;
      }
      client.end();
    })
  );
  // The following returns empty
  return names;
}

console.log(myfunc(1,2));

Как я могу заставить его вырваться за рамки?

Ответы [ 3 ]

1 голос
/ 04 ноября 2010

Если client.query (...) является асинхронным, то функция selectCb не будет работать, а names не изменится ко времени myfunc возвращается.Вам необходимо изменить myfunc , чтобы он асинхронно возвращал names (например, принимая параметр функции, который вызывается в конце selectCb ).

1 голос
/ 04 ноября 2010

Это пусто, потому что вызов вашей функции «запрос» асинхронный .Функция, которую вы передаете в нее, не будет запущена, пока не станут доступны результаты.Следовательно, ваша функция «myfunc» возвращается немедленно, задолго до вызова этой функции обратного вызова.

Используя Javascript в браузере, вы должны подумать об этом.Вместо того чтобы ожидать, что ваши «имена» будут готовы немедленно, измените «myfunc» так, чтобы вы передавали it функцию обратного вызова, которая будет вызываться, когда имена действительно доступны:

var myfunc = function(client, id, whenFinished) {
  var names = new Array();
  client.query(
    'SELECT stuff FROM mytable WHERE id="'+id+'"',
    (function selectCb(err, results, fields) {
      if (err) {
        throw err;
      }
      for (result in results) {
        // This prints fine
        console.log(results[result].name);
        names[result] = results[result].name;
      }
      client.end();
      if (whenFinished) whenFinished(names); // callback
     })
  );
};

Nowкогда вы вызываете свою функцию, вместо того, чтобы ожидать «имена» в качестве возвращаемого значения, вы передаете другую функцию, которая будет действовать в списке имен:

myfunc(1, 2, function(names) { console.log(names); });
0 голосов
/ 04 ноября 2010
var names = new Array();

var myfunc = function(client, id) {

  client.query(
    'SELECT stuff FROM mytable WHERE id="'+id+'"',function selectCb(err, results, fields)
  {
      if (err) {
        throw err;
      }
      for (result in results) {
        // This prints fine
        console.log(results[result].name);
        names[result] = results[result].name;
      }
      client.end();
    }
  );
  // The following returns empty
  return names;
}

console.log(myfunc(1,2));

попробуйте сделать имена глобальными

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