【发布时间】:2021-07-24 02:25:07
【问题描述】:
当我调用时考虑这两个函数 getStatusAll(数据)-
data=[[],['1'],['2'],['3']];
async function getStatusAll(data) {
console.log("In getStatusAll");
try{
let statusPromiseArray = data.map(async(value) => {
result= await this.fetchStatusDBs(value);
return result;
});
statusResolvedArray= await Promise.all(statusPromiseArray)
return statusResolvedArray;
}catch(err){
throw(err);
}
}
async function fetchStatusDBs(data) {
console.log("In fetchStatusDBs");
try{
//fetch status in dvf_req_id for an dvf_req_id
if(data.length==0){
console.log("1");
dvfStatus = await Promise.resolve("Disabled");
console.log("2");
trainingStatus = await Promise.resolve("Disabled");
console.log("3");
inferenceStatus = await Promise.resolve("Disabled");
}
else {
console.log("4");
dvfStatus = await Promise.resolve("Enabled");
console.log("5");
trainingStatus = await Promise.resolve("Enabled");
console.log("6");
inferenceStatus = await Promise.resolve("Enabled");
}
return [dvfStatus,trainingStatus,inferenceStatus];
}catch(err){
throw(err);
}
}
我正在尝试解决 Promise.all 中的多个 Promise 但结果出乎意料。 实际输出-
在 getStatusAll 在 fetchStatusDBs 1 在 fetchStatusDBs 4 在 fetchStatusDBs 4 在 fetchStatusDBs 4 2 5 5 5 3 6 6 6 [["启用","启用","禁用"],["启用","启用","启用"],["启用","启用","启用"],["启用","启用","启用"]]预期输出-
在getStatusAll中 内部地图 在 fetchStatusDBs 1 2 3 内部地图 在 fetchStatusDBs 4 5 6 内部地图 在 fetchStatusDBs 4 5 6 内部地图 在 fetchStatusDBs 4 5 6 [["禁用","禁用","禁用"],["启用","启用","启用"],["启用","启用","启用"],["启用","启用","启用"]]
但是像这样更改 fetchStatusDB 会以正确的格式返回输出。
async function fetchStatusDBs(data) {
console.log("In fetchStatusDBs");
try{
if(data.length==0){
dvfStatus = "Disabled";
trainingStatus = "Disabled";
inferenceStatus = "Disabled";
}
else {
dvfStatus = "Enabled";
trainingStatus = "Enabled";
inferenceStatus = "Enabled";
}
return [dvfStatus,trainingStatus,inferenceStatus];
}catch(err){
throw(err);
}
}
有人可以帮帮我吗?
【问题讨论】:
-
你没有声明
dvfStatus等等,所以它们要么在单个外部范围内“共享”(如果你在那里声明它们),或者隐式全局变量(如果你没有声明他们在任何地方 - 顺便说一句,这是非常糟糕的做法)。因此,当每个 Promise 都“同时”运行时(实际上并非如此,但最好将其视为同时运行),这些变量的设置和读取以不一定容易预测的方式相互重叠。
标签: javascript node.js promise es6-promise