为什么 await 在等待代码完成时不起作用

坎海亚布格斯

我正在尝试从 firebase 读取数据。但是代码异步工作,它在获取数据之前显示数据。

我已经发布了我的代码

componentDidMount(){
    var ref2 = database.ref();
    this.getItems(ref2).then((items) => {
        this.getResult(items).then((val) => {
            // why is this val coming empty 
            ToastAndroid.show(JSON.stringify(val), ToastAndroid.SHORT);
        });
    });
  }

getItems = async (ref2) => {
    var items = [];
    await ref2.once('value', snap => {
        snap.forEach((child) => {
            items.push(child.key);
        });
    });

    // this is working fine . items is correctly returned        
    return items;
}
getResult = async (items) => {
    var response = await this.getFinal(items); 
    // this response is empty why 
    return response;
}
getFinal = async (items) => {
    var result = [];
    await items.forEach((key) => {
        ref = database.ref(key);
        ref.once('value', snap => {

            snap.forEach((child) => {
                //val.push(child.val());
                var id = child.key;
                var data = {
                    username: child.val().username,
                    email: child.val().email,
                    name: child.val().name
                };
                result.push({[id]:data});    
            });
        });
    });
    // this result is empty why   
    return result;
}

我期待 val 不为空,结果也不为空

弗兰克·范·普费伦

正如 Lukas 评论的Array.forEach()那样不返回承诺,所以调用await它没有任何用处。

DatabaseReference.once()但是调用确实返回了一个承诺,并且由于您有多个这样的调用,因此您可以收集这些承诺并等待所有这些承诺完成,然后再返回结果:

getFinal = async (items) => {
    var promises = [],
        result = [];
    items.forEach((key) => {
        ref = database.ref(key);
        let promise = ref.once('value', snap => {
            snap.forEach((child) => {
                var id = child.key;
                var data = {
                    username: child.val().username,
                    email: child.val().email,
                    name: child.val().name
                };
                result.push({[id]:data});    
            });
        });
        promises.push(promise)
    });
    await Promise.all(promises);
    return result;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么 Await 在异步函数中不起作用?

为什么“ await client.say()”在我的代码中不起作用?

为什么不'await'等待axios请求完成?

选择时 Jquery 自动完成提交表单 - 为什么此代码不起作用?

为什么await语句在新的Promise构造函数中不起作用

为什么 await 关键字在匿名函数中不起作用?

为什么在我的情况下`async / await`不起作用?

为什么我的 await 在我的功能中不起作用?“语法错误:等待仅在异步函数中有效”

为什么添加.386时我的代码不起作用?

为什么将await *从异步/等待建议中删除?

在mvc中下载文件后发出警报(“完成”)时,为什么我的代码不起作用?

为什么功能代码不起作用

为什么这段代码不起作用?

为什么这段代码不起作用?

为什么这段代码不起作用?

为什么我的代码不起作用?

为什么这段代码不起作用?

为什么此代码不起作用?

Javascript 代码不起作用。为什么?

为什么这段代码不起作用?

带有async / await的async.js-需要帮助来解释为什么这不起作用

为什么完成不起作用?完成问题

为什么自动完成有时在 python IDE 中不起作用

async/await 在 NodeJS 中不起作用,它不会等待

为什么“ cc”和“ c ++”的Bash完成不起作用?

为什么我的自动完成输入不起作用?

为什么 UseState 有时在我的代码中有时不起作用

为什么在删除某些配置时vim源代码_vimrc不起作用,而在添加某些配置时却起作用?

为什么不起作用?