Javascript 如何嵌套承诺(Promise.all-in-Promise.all)

Javascript 如何嵌套承诺(Promise.all-in-Promise.all),javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,考虑嵌套的承诺的以下结构: const getData=async()=>{ 常数参考=[{ 名称:“John33”, 年龄:33 }, { 名称:“John34”, 年龄:34 }, { 名称:“John35”, 年龄:35 }, { 名称:“John36”, 年龄:36 } ]; 让源=[{ 名称:“John30”, 年龄:“未知” }, { 名称:“John31”, 年龄:“未知” }, { 名称:“John32”, 年龄:“未知” }, { 名称:“John33”, 年龄:“未知” }

考虑嵌套的
承诺的以下结构:

const getData=async()=>{
常数参考=[{
名称:“John33”,
年龄:33
},
{
名称:“John34”,
年龄:34
},
{
名称:“John35”,
年龄:35
},
{
名称:“John36”,
年龄:36
}
];
让源=[{
名称:“John30”,
年龄:“未知”
},
{
名称:“John31”,
年龄:“未知”
},
{
名称:“John32”,
年龄:“未知”
},
{
名称:“John33”,
年龄:“未知”
},
{
名称:“John34”,
年龄:“未知”
},
{
名称:“John35”,
年龄:“未知”
}, {
名称:“John36”,
年龄:“未知”
},
{
名称:“John37”,
年龄:“未知”
},
{
名称:“John38”,
年龄:“未知”
},
{
姓名:“John39”,
年龄:“未知”
}
];
常量解析程序=doc=>{
返回新承诺(doc=>{
让克隆={…doc
};
let found=refs.find(ref=>{
返回ref.name==doc.name;
});
如果(找到)clone.age=found.age;
返回克隆;
});
};
让getRefs=(doc,refs)=>{
const promises=refs.map(r=>{
解析程序(文档)。然后(结果=>{
返回结果;
});
});
返回承诺。全部(承诺);
};
让getCursorData=(光标、引用、数据)=>{
const promises=cursor.forEach(doc=>{
console.log(“获取“+doc.name”的光标);
让克隆={…doc
};
返回getRefs(克隆,引用)。然后(结果=>{
log(“获取“+clone.name”的引用);
数据推送(结果);
});
返回;
});
返回承诺。全部(承诺);
};
//获取数据
让数据=[];
等待getCursorData(源、引用、数据);
log(“返回的数据:”);
控制台日志(数据);
返回数据;
};
console.log(“开始”);
getData()。然后(结果=>{
控制台日志(“结束”);
console.log(结果)
});给你

const-SimulatedDatabaseCall=新承诺(解析=>{
设置超时(()=>{
决心([
{
姓名:'John33',
年龄:33
},
{
姓名:'John34',
年龄:34
},
{
姓名:'John35',
年龄:35
},
{
姓名:'John36',
年龄:36
}
]);
}, 200);
});
让源=[
{
姓名:'John30',
年龄:“未知”
},
{
姓名:'John31',
年龄:“未知”
},
{
名称:“John32”,
年龄:“未知”
},
{
姓名:'John33',
年龄:“未知”
},
{
姓名:'John34',
年龄:“未知”
},
{
姓名:'John35',
年龄:“未知”
},
{
姓名:'John36',
年龄:“未知”
},
{
姓名:'John37',
年龄:“未知”
},
{
姓名:'John38',
年龄:“未知”
},
{
姓名:'John39',
年龄:“未知”
}
];
异步函数updateSource(源,模拟DatabaseCall){
等待模拟的DatabaseCall;
SimulatedDatabaseCall.then(_database=>{
var sourceMap=source.map(\u sourceOBJ=>{
返回_sourceOBJ.name;
});
_database.forEach(_databaseOBJ=>{
var index=sourceMap.indexOf(_databaseOBJ.name);
source[index].age=\u databaseOBJ.age;
});
});
返回源;
}
updateSource(源,SimulatedDatabaseCall)。然后(\u val=>{
console.log(_val);
});给你

const-SimulatedDatabaseCall=新承诺(解析=>{
设置超时(()=>{
决心([
{
姓名:'John33',
年龄:33
},
{
姓名:'John34',
年龄:34
},
{
姓名:'John35',
年龄:35
},
{
姓名:'John36',
年龄:36
}
]);
}, 200);
});
让源=[
{
姓名:'John30',
年龄:“未知”
},
{
姓名:'John31',
年龄:“未知”
},
{
名称:“John32”,
年龄:“未知”
},
{
姓名:'John33',
年龄:“未知”
},
{
姓名:'John34',
年龄:“未知”
},
{
姓名:'John35',
年龄:“未知”
},
{
姓名:'John36',
年龄:“未知”
},
{
姓名:'John37',
年龄:“未知”
},
{
姓名:'John38',
年龄:“未知”
},
{
姓名:'John39',
年龄:“未知”
}
];
异步函数updateSource(源,模拟DatabaseCall){
等待模拟的DatabaseCall;
SimulatedDatabaseCall.then(_database=>{
var sourceMap=source.map(\u sourceOBJ=>{
返回_sourceOBJ.name;
});
_database.forEach(_databaseOBJ=>{
var index=sourceMap.indexOf(_databaseOBJ.name);
source[index].age=\u databaseOBJ.age;
});
});
返回源;
}
updateSource(源,SimulatedDatabaseCall)。然后(\u val=>{
console.log(_val);

});我看到“代码>结束<代码>打印,虽然它打印在所有这些代码的中间某处。也许问题是您需要等待
然后
调用
getData
?您确定。修复了代码的行为与我的原始错误相同…
new Promise()
将获取
resolve
(和
reject
)函数作为参数的函数作为参数,而不是
doc
。这毫无意义。缺少什么解释呢?我相信你应该在
getCursorData
中使用
forEach
时使用
map
。如果你解决了这个问题,你会坚持到底,但是你会得到一堆
未定义的
数组。这是你想要的结果吗?我看到了<代码>结束/代码>打印,尽管它打印在所有的代码中的某个地方。也许问题是您需要等待
然后
调用
getData
?您确定。修复了代码的行为与我的原始错误相同…
new Promise()
将获取
resolve
(和
reject
)函数作为参数的函数作为参数,而不是
doc
。这毫无意义。缺少什么解释呢?我相信你应该在
getCursorData
中使用
forEach
时使用
map
。如果你解决了这个问题,你会坚持到底,但是你会得到一堆
未定义的
数组。这是您使用此数据库的预期结果吗