Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺。所有奇怪的决议问题_Javascript_Node.js_Promise_Es6 Promise - Fatal编程技术网

Javascript 承诺。所有奇怪的决议问题

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

当我调用时,请考虑这两个函数 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"]]
有人能帮我吗?

您的主要问题是
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 FROM
model\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);
  }
}