1

私は Node.js が初めてです。ここで行ったのは、フォルダー内のファイルリストを取得することだけです... Node.jsのすべてが非同期のように見えますが、私の機能は同期的にしたいです。だから、私は次のようにします。

function getFiles() {
var file = [];
var walker = walk.walk('./files');

walker.on('file', function (root, stat, next) {
    file.push(root + '/' + stat.name);
    next();
})

walker.on('end', function () {
    console.log(JSON.stringify(file));
})

return file;}

期待どおりに機能しました:

["./files/1.mp3","./files/2.mp3","./files/3.mp3","./files/4.mp3","./files/5.mp3","./files/6.mp3","./files/7.mp3","./files/8.mp3"]

しかし、その関数を変数に割り当てたとき

var list = getFiles();
 response.writeHead(200, {'Content-type':'application/json'});
response.end(JSON.stringify(list));

常に何もgetFiles()返されませんでした。別のスレッドで実行されているため、データの値を受け取ることができないと思います。お読みいただきありがとうございます。

4

2 に答える 2

2

実行中のアプリケーションの流れを概説することで、発生している動作に光を当てることができます。

call to getFiles
  declare files array and walker
  bind walker event "file" and "end" to callbacks
  return files array

walker file event fires
walker end event fires

ご覧のとおり、イベントはメソッド呼び出しで帯域外で発生しています。これに対処するための一般的な node.js アプローチは、次のようなコードをセットアップすることです。

function getFiles(callback) {
  var file = [];
  var walker = walk.walk('./files');

  walker.on('file', function (root, stat, next) {
    file.push(root + '/' + stat.name);
    next();
  })

  walker.on('end', function () {
    callback(file);
  })
}

このメソッドを実行するときは、次のようにします。

getFiles(function(list){
  response.writeHead(200, {'Content-type':'application/json'});
  response.end(JSON.stringify(list));
});

コントローラーがコールバック シナリオを作成する必要があり、getFiles メソッドがそのコールバックを実行する必要があるため、明らかにこれは少し見苦しいです。もう 1 つのアプローチは、Promises の概念を使用することです。これについては、次のリンクを使用して読者の発見に任せます: https://github.com/kriskowal/q

于 2013-08-12T03:30:55.517 に答える
1
  • 非同期関数は、準備が整う前に戻ります
  • 独自のコードにないデータを返すことはできません
  • 非同期関数は、多くの場合、準備ができたときに実行されるコールバック引数を取ります
  • 独自のコードで独自のコールバックを要求できます

`

function getFiles(callBack) {
var file = [];
var walker = walk.walk('./files');

walker.on('file', function (root, stat, next) {
    file.push(root + '/' + stat.name);
    next();
})

walker.on('end', function () {
    console.log(JSON.stringify(file));
    callBack(file);
})

}

// assuming server environment, express, connect, etc...

app.get('/list', function(req, res){
      getFiles(function(D){ res.json(D) });
});

`

于 2013-08-12T03:32:22.117 に答える