繁体   English   中英

参考错误,表示未定义变量

[英]Reference error, says variable is not defined

因此,我有一个从Firebase数据库读取然后创建对象数组的函数。 我已经定义了变量key ,但是它仍然不可用。

var usersList = [];

const ref = firebase.database().ref()

function fetchUsers() {

    ref.child('users').once('value').then(snap => {
        var promises = [];

        snap.forEach(childSnap => {

            var key = childSnap.key

            promises.push
                (ref.child(`users/${key}/points`).once('value')
            );


        });

        return Promise.all(promises);

    }).then(function(snapshots) {
        return snapshots.map(snapper => {
        var points = snapper.val()
        return {uid: key, points: points};
        })
    }).then(function(usersList) {
        console.log(usersList)
    })

}

这是我得到的错误...

(node:11724) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ReferenceError: key is not defined

如果我只是这样做: key = childSnap.key ,那么每个对象的uid都是相同的。

key仅在forEach回调中定义。 当然,你不能再从第二个中引用它then回调。 此外,它将是哪把key 对于第一个条目? 第二? 第三?

相反,您需要返回带有值的键:

function fetchUsers() {
    ref.child('users').once('value').then(snap => {
        var promises = [];
        snap.forEach(childSnap => {
            var key = childSnap.key;
            promises.push(
                ref.child(`users/${key}/points`).once('value').then(
                    snapper => ({key, snapper})    // **
                )
            );
        });

        return Promise.all(promises);
    }).then(function(snapshots) {
        return snapshots.map(({key, snapper}) => { // **
            var points = snapper.val();
            return {uid: key, points: points};
        });
    }).then(function(usersList) {
        console.log(usersList);
    });
}

在上面的第一行** ,我们once转换了结果,因此它返回一个既包含键又包含“快照程序”的对象。

在第二行** ,我们使用结构化参数接收那些对象作为不同的keysnapper参数。


FWIW,如果您要积极使用简洁箭头:

function fetchUsers() {
    ref.child('users').once('value').then(snap =>
        Promise.all(snap.map(childSnap => {
            const key = childSnap.key;
            return ref.child(`users/${key}/points`)
                        .once('value')
                        .then(snapper => ({key, snapper}));
        }))
    ).then(snapshots =>
        snapshots.map(({key, snapper}) => ({uid: key, points: snapper.val()}))
    ).then(usersList => {
        console.log(usersList);
    });
}

还要注意使用map而不是声明数组并从forEach回调中将其推入。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM