承诺解决对象给空对象

时间:2018-08-11 22:46:36

标签: javascript promise

因此,在我的Node文件中,我从Mongoose数据库中获取了一些数据,执行了一些操作,并且我希望在末尾使用字典这样的对象。现在,我的Mongoose数据库只有我想要的两个对象,因此我使用aggregate命令来给我这些对象。然后,我遍历结果,并将其添加到字典中。然后,我想显示字典中的内容。由于所有这些都是异步的,因此我不得不学习/使用承诺。因此,这是我生成的代码:

function f1(){
    return new Promise(resolve=>{    
        collectionName.aggregate([
        {
            $group:
                {
                _id: "$ids",
                property: {$max: "$properties"}
                }
            }
    ]).then(data=>{
        for(i=0; i<data.length; i++){
            dictionary[data[i]['_id']] = data[i]['property'];
        }
    });
    resolve(dictionary);
    });

    };

async function f2(){
    var dict = await f1()
    console.log(dict)

f1();
f2();

当我将console.log放入for循环中时,我得到了想要的数据,因为它具有id和字典形式的属性。但是,当我运行f2时,我仅得到{}作为输出。有人知道为什么吗?

1 个答案:

答案 0 :(得分:0)

由于resolve(dictionary)aggregate()的{​​{1}}之外,它在填充then()之前执行,因此为空对象。尝试将dictionary移动到resolve(dictionary)的{​​{1}}内部,而不是返回值为then()的Promise。实际上,您正在尝试chain promises。确保还同时返回整个aggregate(),以确保整个承诺都从dictionary返回。

collectionName.aggregate()

希望有帮助!