Javascript 承诺解析对象给空对象

Javascript 承诺解析对象给空对象,javascript,promise,Javascript,Promise,所以在我的节点文件中,我从Mongoose数据库中获取一些数据,执行一些操作,最后我想要一个类似字典的对象。现在我的Mongoose数据库只有两个我想要的对象,所以我使用aggregate命令来提供这些对象。然后,我循环遍历结果,并将它们添加到字典中。然后,我想显示字典中的内容。由于这一切的异步性,我不得不学习/使用承诺。因此,这是我生成的代码: function f1(){ return new Promise(resolve=>{ collectionN

所以在我的节点文件中,我从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();
函数f1(){
返回新承诺(解析=>{
collectionName.aggregate([
{
$group:
{
_id:“$ids”,
属性:{$max:$properties}
}
}
])。然后(数据=>{
对于(
resolve(dictionary)
位于
aggregate()
then()
之外的(i=0;i),它在填充
dictionary
之前执行,因此为空对象。请尝试将
resolve(dictionary)
移动到
aggregate()的
then()
内部
而不是返回值为
字典的承诺。实际上,您正在尝试。请确保同时返回
collectionName.aggregate()
作为一个整体,以确保从
f1()
返回整个承诺

函数f1(){
返回新承诺(解决=>{
return collectionName.aggregate([{
$group:{
_id:“$ids”,
财产:{
$max:“$properties”
}
}
}])。然后(数据=>{
对于(i=0;i

希望这能有所帮助!

就这么简单……不过为了理解,我不应该在我称之为承诺的同一级别(即,在当时之外)解决承诺吗?我似乎无法理解为什么它应该在协议内部,这只是执行时间的问题。
解决(字典)
在函数
aggregate()
解析之前执行。在
then()中返回
resolve(dictionary)
,一旦
aggregate()
成功解析,则返回已解析的承诺。
function f1() {
  return new Promise(resolve => {
    return collectionName.aggregate([{
      $group: {
        _id: "$ids",
        property: {
          $max: "$properties"
        }
      }
    }]).then(data => {
      for (i = 0; i < data.length; i++) {
        dictionary[data[i]['_id']] = data[i]['property'];
      }

      return resolve(dictionary);
    });
  });
}