Nodejs は非同期であるため、この行knex('projects').select('name').then...
が実行されるとすぐに、「return project_names;」という行が返されます。実行されます。お気づきのように、値が入力されるまで待機しませんでした!
メソッドの最後にある標準的な「リターン」は、イベント ベースの Nodejs のプログラミング スタイルとしては適切ではありません。それなりの場所はありますが、より一般的なのはコールバック アプローチです。この新しいアプローチに関するいくつかのチュートリアルを読むことを検討してください (私はこれが好きです)
現在のコードを次のように変更できます。
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」に渡します。イベントが発生すると、結果がプロジェクト名にプッシュされると、コールバックが新しいリストで呼び出されます。