2016-05-11 10 views
2
function extractId3(value, index, list) { 
    if (path.extname(value) === '.mp3') { 
    id3js({ file: '/Users/user/materialApp/client/songs/' + value, type: id3js.OPEN_LOCAL }, function(err, tags) { 
     return tags.v2.image; 
    }); 
    } 
} 

exports.index = function(req, res) { 
    fs.readdir('/Users/user/materialApp/client/songs', function(err, files) { 
    images = _.map(files, extractId3); 
    console.log(images); 
    res.json(files); 
    }); 
}; 

私は、Web開発とnodejsの非同期性がかなり新しいです。mp3ファイル名の配列をループし、node3の別の配列にid3タグを抽出します。

私はfs.readdir()の後に出てくるすべてのmp3ファイルをループし、それらからid3タグを抽出しようとしています。

console.log(images)は、[]を生成します。

私はid3js()という非同期の性質をどのように扱うのか理解できません。この情報を抽出し、このhttp要求への応答として渡す正しい方法は何でしょうか。

+0

をid3jsは何を返すのですか?私は約束を見て、あなたの配列を構築するためにそれらを使用することをお勧めします – winhowes

答えて

1

使用Pluckの

摘む _.pluck(リスト、propertyNameの)マップのおそらく最も一般的なユースケース 何であるかの便利なバージョン: プロパティ値のリストを抽出します。

var stooges = [{名前: 'moe'、年齢:40}、{名前: 'ラリー'、年齢:50}、 {名前: '縮れ'、年齢:60}]; _.pluck(stooges、 'name'); => [ "萌え"、 "ラリー"、 "カーリー"]

images = _.pluck(files, extractId3); 
0

私は仕事にそれを得ることができる唯一の方法は、再帰を使用していました:

exports.index = function(req, res) { 
    var info = new Array(); 
    fs.readdir('/Users/user/materialApp/client/songs', function(err, files) { 
    var mp3s = uscore.filter(files, function(file) { if(path.extname(file) === '.mp3') return file}); 
    var ID = 0; 
    console.log(mp3s.length); 
    if (ID < mp3s.length) 
     extractId3(mp3s[ID]); 
    else 
     console.log(info); 

    function extractId3(file) { 
     id3js({ file: '/user/user/materialApp/client/songs/' + file, type: id3js.OPEN_LOCAL }, function(err, tags) { 
     if(tags.title) { 
      console.log(tags.v1); 
      info.push({'file': file, 'title':tags.title, 'album':tags.album, 'year':tags.year}); 
     } 
     ID++; 
     if (ID < mp3s.length) 
      extractId3(mp3s[ID]); 
     else { 
      res.json(info); 
     } 
     }); 
    } 
関連する問題