2

为什么是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();
4

2 回答 2

3

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

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

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;,而正确的数据仍在检索过程中。因为它是异步的,不会等待。互联网上有很好的示例代码,您可能想查看。

另外,将函数定义如下是一个好习惯

getCauses = function () { ... }
于 2013-10-28T23:15:10.260 回答
0

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

于 2013-10-28T23:11:58.003 回答