Javascript 承诺。所有奇怪的决议问题
当我调用时,请考虑这两个函数 getStatusAll(数据)- 我试图在一个承诺中解决多个承诺 但结果出乎意料。 实际产量- In getStatusAll In fetchStatusDBs 1 In fetchStatusDBs 4 In fetchStatusDBs 4 In fetchStatusDBs 4 2 5 5 5 3 6 6 6 [["Enabled","Enabled","Disabled"],["Enabled","Enabled","Enabled"],["Enabled","Enabled","Enabled"],["Enabled","Enabled","Enabled"]]Javascript 承诺。所有奇怪的决议问题,javascript,node.js,promise,es6-promise,Javascript,Node.js,Promise,Es6 Promise,当我调用时,请考虑这两个函数 getStatusAll(数据)- 我试图在一个承诺中解决多个承诺 但结果出乎意料。 实际产量- In getStatusAll In fetchStatusDBs 1 In fetchStatusDBs 4 In fetchStatusDBs 4 In fetchStatusDBs 4 2 5 5 5 3 6 6 6 [["Enabled","Enabled","Disabled"],["Enabled","Enabled","Enabled"],["Enable
有人能帮我吗?您的主要问题是
fetchStatusDBs
中的状态变量未声明,因此。由于您的代码正在进行多个并发调用,这些调用在wait
挂起点交错,因此它们相互影响—这是一个典型的竞争条件。要解决这个问题,只需使用let
或var
声明变量即可
const data=[[],['1'],['2'],['3']];
async function getStatusAll(data) {
console.log("In getStatusAll");
let statusPromiseArray = data.map(this.fetchStatusDBs, this);
return Promise.all(statusPromiseArray);
}
async function fetchStatusDBs(data) {
console.log("In fetchStatusDBs");
let dvfStatus, trainingStatus, inferenceStatus;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//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];
}
这将获得所需的结果(返回值)。要从日志中获得预期的输出,您不能将map
与异步函数一起使用,然后使用Promise等待所有承诺。all
,但您需要按顺序进行调用:
async function getStatusAll(data) {
console.log("In getStatusAll");
const statusArray = [];
for (const value of data) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^
statusArray.push(await this.fetchStatusDBs(value));
// ^^^^^
}
return statusArray ;
}
您对async Wait有一些误解
async function getStatusAll(data) {
console.log("In getStatusAll");
try{
let statusPromiseArray = data.map(async(value) => { // map is sync
result= await this.fetchStatusDBs(value); // global result
return result; // return-await anti-pattern
});
statusResolvedArray= await Promise.all(statusPromiseArray) // global
return statusResolvedArray; // return-await anti-pattern
}catch(err){ // catch-throw anti-pattern
throw(err);
}
}
任何错误都会自动冒出来。无需捕捉并重新抛出。这将并行执行所有抓取。如果你想的话,你可以按顺序处理请求。这显示为在async
中正确使用wait
-
异步函数getStatusAll(数据){
常量结果=[]
for(数据的常量值)
result.push(等待这个.fetchStatusDBs(值))
返回结果
}
您不声明
dvfStatus
等等,因此它们要么在单个外部范围内“共享”(如果您在其中声明它们),要么隐式全局变量(如果您无法在任何地方声明它们-顺便说一句,这是非常糟糕的做法)。因此,当每个承诺“同时”运行时(实际上不是这样,但最好将其视为是这样),这些变量的设置和读取彼此重叠,不一定容易预测。明白了,但如果我在下面的代码中使用wait的结果。然后我应该编写try-and-catch-right?``async function getModelsSummary(orgId){var query=“SELECT objective,uid,last\u updated\u time FROMmodel\u enabled\u status
where org\u id=?and is\u enabled='1';console.log(“In service getSummaryDetails”);try{queryyoutputlist=wait dObject.query(query,[orgId])reqIDsList=await serviceHelper.getReqIDs(queryOutputList[0]);statusList=await serviceHelper.getStatusAll(reqIDsList);console.log(“\n响应正文:“+JSON.stringify(statusList));return statusList;}catch(err){throw(err);}````@UjjwalMadan No.您应该只写try{…}
如果您的catch
块执行的操作不仅仅是重复错误。(注意这与async/await无关,同步代码也是如此)。如果你曾经看到自己在写。。。catch(err){throw error}
只需删除整个try
/catch
块即可。同样适用于return wait someFunc()
,在async
函数中,它与return someFunc()
const data=[[],['1'],['2'],['3']];
async function getStatusAll(data) {
console.log("In getStatusAll");
let statusPromiseArray = data.map(this.fetchStatusDBs, this);
return Promise.all(statusPromiseArray);
}
async function fetchStatusDBs(data) {
console.log("In fetchStatusDBs");
let dvfStatus, trainingStatus, inferenceStatus;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//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];
}
async function getStatusAll(data) {
console.log("In getStatusAll");
const statusArray = [];
for (const value of data) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^
statusArray.push(await this.fetchStatusDBs(value));
// ^^^^^
}
return statusArray ;
}
async function getStatusAll(data) {
console.log("In getStatusAll");
try{
let statusPromiseArray = data.map(async(value) => { // map is sync
result= await this.fetchStatusDBs(value); // global result
return result; // return-await anti-pattern
});
statusResolvedArray= await Promise.all(statusPromiseArray) // global
return statusResolvedArray; // return-await anti-pattern
}catch(err){ // catch-throw anti-pattern
throw(err);
}
}