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".当事件触发时,一旦将结果推送到项目名称中,就会使用新列表调用回调.
| 归档时间: |
|
| 查看次数: |
18323 次 |
| 最近记录: |