【问题标题】:knex select() returns before completing query in javascriptknex select() 在 javascript 中完成查询之前返回
【发布时间】:2014-01-03 10:09:48
【问题描述】:

我有这样的功能:

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

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

【问题讨论】:

  • 您的问题询问“如何选择 * from”.... 当询问如何从 knex 中选择 * 时,这是谷歌的最高结果。不幸的是,在您的问题正文中,您根本不想选择 * ......您特别想选择一个列。
  • 如果有人来这里寻找select *,那么没有任何参数的.select() 方法对我有用。
  • 谢谢@NoSound,有人应该纠正这个问题。

标签: javascript node.js asynchronous promise knex.js


【解决方案1】:

我知道这是旧的,但你可以这样做:

function get_projects() {
    return knex('projects').select('name')
        .then(function (records) {
           // already returns an array you can do other things here
           return records;
        })
}

现在您可以执行此操作来访问数据。

get_projects()
    .then(function (records) {
        // do what you need as well, like send to the frontend using express
        res.send(records);
    })

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      Nodejs 是异步的,所以只要你的行 knex('projects').select('name').then... 被执行,行 `return project_names;'正在运行。正如您所发现的,它并没有等到它被值填充!

      方法末尾的标准“返回”对于基于事件的 Nodejs 来说并不是一种好的编程风格。它有它的位置,但更常见的是回调方法。考虑阅读一些关于这种新方法的教程(我喜欢this one

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

      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);
        })
      }
      

      注意:这不是优化代码

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-30
        • 2018-05-07
        • 1970-01-01
        • 2019-03-07
        • 2016-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多