Javascript JS async/await不会等待我的函数解析它们的承诺

Javascript JS async/await不会等待我的函数解析它们的承诺,javascript,async-await,es6-promise,aurelia,Javascript,Async Await,Es6 Promise,Aurelia,你能帮我理解为什么这不起作用吗: 我在Aurelia工作,我尝试使用validation controller验证一些输入数据,如下所述: 现在,我有了这个数据的映射,在这里我需要评估每个条目,我想创建一个数组,其中每个条目都包含每个条目的验证结果,完成所有操作后,返回数组 所以类似这样的简化: function ValidateAll(InputDataMap){ let validationResults = new Array(); InputDataMap.forEach((i

你能帮我理解为什么这不起作用吗:

我在Aurelia工作,我尝试使用validation controller验证一些输入数据,如下所述:

现在,我有了这个数据的映射,在这里我需要评估每个条目,我想创建一个数组,其中每个条目都包含每个条目的验证结果,完成所有操作后,返回数组

所以类似这样的简化:

function ValidateAll(InputDataMap){
  let validationResults = new Array();

  InputDataMap.forEach((item) => {
     validationResults.push(validateEntry(item));
  });

 return validationResults;
}

function validateEntry(item){

(aurelia's validation)controller.validate(item, "some value", "some rule")
      .then(result => {
        return result;
      });
}
现在,这当然行不通,因为我需要等待验证控制器解决它的承诺,然后才能获得任何数据,到目前为止,我在这方面失败了

我了解到,如果使用async/await关键字,它将暂停函数,直到承诺得到解决,因此我做了一些更改,如下所示:

function ValidateAll(InputDataMap){
      let validationResults = new Array();

      InputDataMap.forEach(async(item) => {

         let result = await validateEntry(item);
         validationResults.push(result);
});
现在,这也不起作用,这就是我想知道的。我假设我的validateEntry函数在运行后被wait视为已完成,而不是等待validateEntry中的validate函数的承诺得到解决。我能把它写得像这样简单,稍加修改,然后仍然可以工作吗

我了解到,如果使用async/await关键字,它将暂停函数,直到承诺得到解决,因此我做了一些更改,如下所示:

function ValidateAll(InputDataMap) {
  return Promise.all(InputDataMap.map(item => validateEntry(item)));
}
实际上,它确实暂停了函数,但asyncitem=>{//Code}是另一个不受外部函数影响的函数

async function ValidateAll(InputDataMap){
      let validationResults = [];
      for (item of InputDataMap) {
          let result = await validateEntry(item);
          validationResults.push(result);
      }
      return validationResults;      
});
还要注意函数声明前面的async关键字,这意味着您必须通过let results=wait ValidateAllinputData或类似的ValidateAllinputData来使用它。thenresults=>{//Code}

我了解到,如果使用async/await关键字,它将暂停函数,直到承诺得到解决,因此我做了一些更改,如下所示:

function ValidateAll(InputDataMap) {
  return Promise.all(InputDataMap.map(item => validateEntry(item)));
}
实际上,它确实暂停了函数,但asyncitem=>{//Code}是另一个不受外部函数影响的函数

async function ValidateAll(InputDataMap){
      let validationResults = [];
      for (item of InputDataMap) {
          let result = await validateEntry(item);
          validationResults.push(result);
      }
      return validationResults;      
});
还要注意函数声明前面的async关键字,这意味着您必须通过let results=wait ValidateAllinputData或类似的ValidateAllinputData来使用它。thenresults=>{//Code}


您必须从validateEntry返回一个承诺:

然后只返回其参数不是必需的,并且不执行任何操作,因此可以删除.thenresult=>{return result;}

forEach的异步回调不会使ValidateAll等待验证。您必须等待所有承诺得到解决,然后从ValidateAll返回一个承诺,forEach可以被map替换,这样您就不需要手动推送:

let validationResults = new Array();

validationResults = InputDataMap.map(item => validateEntry(item));
这里不需要异步,因为这里不需要等待。现在validationResults包含一个承诺列表。您现在需要使用Promise.all,直到这些问题得到解决

function ValidateAll(InputDataMap){
  let validationResults = InputDataMap.map(item => validateEntry(item));

  return Promise.all(validationResults);
}
现在ValidateAll将返回一个承诺,该承诺将使用包含验证结果的数组进行解析

您可以将代码进一步缩短为:

function ValidateAll(InputDataMap){
  return Promise.all( InputDataMap.map(validateEntry) );
}

您必须从validateEntry返回一个承诺:

然后只返回其参数不是必需的,并且不执行任何操作,因此可以删除.thenresult=>{return result;}

forEach的异步回调不会使ValidateAll等待验证。您必须等待所有承诺得到解决,然后从ValidateAll返回一个承诺,forEach可以被map替换,这样您就不需要手动推送:

let validationResults = new Array();

validationResults = InputDataMap.map(item => validateEntry(item));
这里不需要异步,因为这里不需要等待。现在validationResults包含一个承诺列表。您现在需要使用Promise.all,直到这些问题得到解决

function ValidateAll(InputDataMap){
  let validationResults = InputDataMap.map(item => validateEntry(item));

  return Promise.all(validationResults);
}
现在ValidateAll将返回一个承诺,该承诺将使用包含验证结果的数组进行解析

您可以将代码进一步缩短为:

function ValidateAll(InputDataMap){
  return Promise.all( InputDataMap.map(validateEntry) );
}

您必须返回一个包含所有异步操作的承诺,如下所示:

function ValidateAll(InputDataMap) {
  return Promise.all(InputDataMap.map(item => validateEntry(item)));
}

您必须返回一个包含所有异步操作的承诺,如下所示:

function ValidateAll(InputDataMap) {
  return Promise.all(InputDataMap.map(item => validateEntry(item)));
}

您可以尝试使用Promise.all获得所有结果;让validationResultObjects=Promise.allvalidate;validationResultObjects.then=>{console.log=done;};但即使在Promise.all完成运行之后,它也没有在validateEntry内解决该承诺。因此,我没有进一步的,您可以尝试使用Promise.all来获得所有结果;让validationResultObjects=Promise.allvalidate;validationResultObjects.then=>{console.log=done;};但即使在Promise.all完成运行之后,它也没有在validateEntry内解决该承诺。因此,我没有进一步的进展,等待回报没有多大意义,它将等待承诺的决心,只是为了将结果传递给新的职业选手
mise,它是由async隐式创建的,因此可以省略那里的wait。如果没有等待,就不再需要异步了。返回等待没有多大意义,它将等待承诺的解析,只是将结果传递给由异步隐式创建的新承诺,因此可以省略那里的等待。没有等待,异步就不再需要了。啊,这让一切变得更清楚了,并帮助我修复了代码,谢谢!啊,这让一切都更清楚了,并帮助我修复了我的代码,谢谢!