Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将async.js映射与node.js一起使用_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 将async.js映射与node.js一起使用

Javascript 将async.js映射与node.js一起使用,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我正在使用node读取许多音频文件的元数据。结果数据的顺序不同,因为元数据是异步读取的,我需要元数据的顺序与文件的顺序相同 为了解决这个问题,我尝试使用async.js映射函数,并使用元数据musicmetadata,这是我找到的唯一一个支持所有不同音频标记的库 然而,我正在努力使这两个库协同工作。我认为这与musicmetadata使用EventTransmitter发送结果数据有关,但很可能我没有正确使用这些函数 下面是我的代码片段: var async = require("async")

我正在使用node读取许多音频文件的元数据。结果数据的顺序不同,因为元数据是异步读取的,我需要元数据的顺序与文件的顺序相同

为了解决这个问题,我尝试使用async.js映射函数,并使用元数据musicmetadata,这是我找到的唯一一个支持所有不同音频标记的库

然而,我正在努力使这两个库协同工作。我认为这与musicmetadata使用EventTransmitter发送结果数据有关,但很可能我没有正确使用这些函数

下面是我的代码片段:

var async = require("async");

files = ["file1.mp3", "file.m4a", "file3.ogg"];
async.map(files, readMetadata, function (err, res) {
    // this is never called
});
用于读取元数据的函数:

var fs = require('fs');
var mm = require('musicmetadata');

function readMetadata(file, callback) {
    var parser = mm(fs.createReadStream(file), {
        duration: true
    });
    parser.on("metadata", function (metadata) {
        var data = {
            artist: metadata.artist[0],
            album: metadata.album,
            title: metadata.title,
            duration: metadata.duration
        };
        callback(null, data);
    });
}
例: 假设我要读取文件的元数据:

files = ["song1", "song2", "song3"];
然后,我希望生成的数组如下所示:

[{
    artist: "artist1",
    album: "album1",
    title: "title",
    duration: duration
},
 {
    artist: "artist2",
    album: "album2",
    title: "title2",
    duration: duration2
},
 {
    artist: "artist3",
    album: "album3",
    title: "title3",
    duration: duration3
}];

你知道我做错了什么吗?

你正在调用map方法,将路径作为变量,但你创建了:

files=[file1.mp3,file.m4a,file3.ogg]

不应该这样吗

async.map(files, readMetadata, function (err, res) {
    // this is never called
});

我需要与文件顺序相同的元数据。为什么?因为如果我添加整个音频文件文件夹,我希望阵列反映文件夹结构。否则,如果我说添加一个相册文件夹,歌曲将不会按顺序显示。好吧,目录列表顺序是不确定的,取决于文件系统,不应该依赖它。但是,如果您想将文件数组顺序与生成的元数据数组顺序相匹配,那么这种方式是有意义的。但是,您完全没有理由需要按顺序处理这些文件。您有文件的数组索引。只需将元数据的数组索引设置为相同即可。如果第3项在第1项之前,则只要设置索引,这并不重要。如果是我,我会保留文件名和元数据。那只是一个输入错误。这是真正代码中的“路径”。很抱歉