搜索

首页  >  问答  >  正文

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

天蓬老师天蓬老师2838 天前777

全部回复(5)我来回复

  • ringa_lee

    ringa_lee2017-04-10 17:13:49

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

    回复
    0
  • 迷茫

    迷茫2017-04-10 17:13:49

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

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 17:13:49

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

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

    回复
    0
  • 高洛峰

    高洛峰2017-04-10 17:13:49

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

    回复
    0
  • 高洛峰

    高洛峰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); 

    回复
    0
  • 取消回复