javascript从函数回调中赋值失败怎么办?
天蓬老师
天蓬老师 2017-04-10 17:11:49
0
5
755

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

répondre à tous(5)
左手右手慢动作

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

迷茫

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

Ty80

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

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

小葫芦

问题很明显,你把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); 
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal