我找了musicmetadata用来读取音乐文件的信息,在使用中,发现在回调中获取了信息之后回传给变量的时候总是不成功。
函数如下:
function readMusicInfo(item) {
var tag = {};
var parser = mm(fs.createReadStream(item.dir), function (err, metadata) {
if (err) throw err;
console.info(metadata); //这里可以成功输出
tag = metadata; //这里赋值了
return tag;
});
}
var newTag = readMusicInfo(example);
console.info(newTag); //undefinded
用什么样的办法解决这个问题比较好?
不好意思手残了,刚才copy代码改错了一些地方……
ringa_lee2017-04-10 17:13:49
两个问题:
1.tag的作用域是在readMusicInfo函数内,console当然是undefinded
2.异步的回调赋值,同步执行的时候,异步回调还没有执行完毕,输出也不可能对。
PHP中文网2017-04-10 17:13:49
tag是局部变量,只在readMusicInfo中可见。
可以在readMusicInfo函数的最后return tag
然后调用的时候 var tag = readMusicInfo(example);
高洛峰2017-04-10 17:13:49
原来的代码
function readMusicInfo(item) {
var tag = {};
var parser = mm(fs.createReadStream(item.dir), function (err, metadata) {
if (err) throw err;
console.info(metadata); //这里可以成功输出
tag = metadata; //这里赋值了
return tag;
});
}
var newTag = readMusicInfo(example);
console.info(newTag);
修改后的代码
function readMusicInfo(item) {
var tag = {};
var parser = mm(fs.createReadStream(item.dir), function (err, metadata) {
if (err) throw err;
console.info(metadata); //这里可以成功输出
tag = metadata; //这里赋值了,这个tag就是上面定义的var tag = {},对于这里的作用域来说,tag相当于全局变量
// return tag; // 已经赋值给了全局变量,这里就不需要return tag,return了也没地方接收
});
return tag; // 执行了var parser会得到tag值,在这里return
}
var newTag = readMusicInfo(example);
console.info(newTag);