赋值后变量未定义

时间:2013-10-28 23:06:28

标签: javascript node.js variables

为什么resultofgetCauses未定义?我不确定该函数是否未返回currentCauses或者是否未将其分配给resultofgetCauses。 。 。或者如果这与异步性有关。

function getCauses(){

  var currentCauses;
  client = pg.connect(connectionString, function(err, client, done){

    if(err) console.log(err);

    client.query('SELECT * FROM causes', function(err, result){
      //console.log(result.rows);
      console.log('poo');
      currentCauses=result.rows;
      //console.log(currentCauses);
    });

  });

  return currentCauses;
};

var resultofgetCauses = getCauses();

2 个答案:

答案 0 :(得分:2)

是的,因为它正在运行asynchronously,当result.rows被分配给currentCauses变量时,行'return currentCauses'已经被执行,因此值未定义。< / p>

您可能希望按照以下方式执行此操作

var resulttofgetCauses;
function getCauses(){
    var currentCauses;
    client = pg.connect(connectionString, function(err, client, done){
        if(err) console.log(err);
        client.query('SELECT * FROM causes', function(err, result){
            //console.log(result.rows);
            console.log('poo');
            currentCauses=result.rows;
            //console.log(currentCauses);
            resulttofgetCauses = currentCauses;
        });
    });
};
getCauses();

为了更具体地回答,执行'SELECT * FROM causes' sql在执行时间之后不会立即给出结果。从数据库中检索数据至少需要0.00秒。因此,在“执行sql”和“接收请求的数据”之间的非常短的时间内,JavaScript已经执行return currentCauses;,而正确的数据仍处于检索过程中。因为它是异步的,不会等待。你可能想在网上找到很好的示例代码。

Plus将函数定义为

是一个很好的做法
getCauses = function () { ... }

答案 1 :(得分:0)

因为currentCauses在从pg.connect函数返回后,在异步调用函数(将函数作为参数传递给getCauses)中初始化。当您返回时,currentCauses的值未定义。