首页 > javascript从函数回调中赋值失败怎么办?

javascript从函数回调中赋值失败怎么办?

我找了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代码改错了一些地方……


两个问题:
1.tag的作用域是在readMusicInfo函数内,console当然是undefinded
2.异步的回调赋值,同步执行的时候,异步回调还没有执行完毕,输出也不可能对。


问题很明显,你把Tag的定义从function内部,移到外层,就可以了


原来的代码

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); 

tag明显是局部变量,你怎么可能在函数外输出


tag是局部变量,只在readMusicInfo中可见。
可以在readMusicInfo函数的最后return tag

然后调用的时候 var tag = readMusicInfo(example);

【热门文章】
【热门文章】