如何在javascript中使用knex选择*?

use*_*766 7 javascript node.js knex.js

我有这样的功能:

function get_projects() {
    var project_names=[];
    knex('projects').select('name').then(function (a) { 
        project_names.push(a);
    })
    return project_names;
}
Run Code Online (Sandbox Code Playgroud)

这个函数return project_names;在完成语句之前执行return语句project_names.push(a),调用这个函数后得到的是一个空数组,即使我的db有结果(如果我在函数a()中登录,我可以看到这个)

Dew*_*wey 11

knex select()返回一个promise,以便您可以在then()函数中继续流程.

knex('projects').select('name').then(function(projectNames){
    //do something here
    console.log(projectNames);
});
Run Code Online (Sandbox Code Playgroud)


cla*_*lay 10

Nodejs是异步的,所以只要你的行knex('projects').select('name').then...执行,就行`return project_names;' 运行.正如你所知,它没有等到它充满价值!

方法结尾处的标准"返回"对于基于事件的Nodej来说不是一种好的编程风格.它有它的位置,但更常见的是回调方法.考虑阅读一些关于这种新方法的教程(我喜欢这个)

您可以将当前代码更改为:

function print_project_names() {
  get_projects( function(names){
    for( var i = 0; i < names.length; i++ )
    {
      console.log(names[i]+'\n');
    } 
  });
}

function get_projects( callback ) {
  var project_names=[];
  knex('projects').select('name').then(function (a) { 
     project_names.push(a);
     callback(project_names);
  })
}
Run Code Online (Sandbox Code Playgroud)

注意:这不是优化代码

在这里,当您想要打印项目名称(不确定您的真实目标)时,您将实际的函数定义(作为"回调" )传递给"get_projects".当事件触发时,一旦将结果推送到项目名称中,就会使用新列表调用回调.