您能帮我了解为什么这不起作用吗?
我正在Aurelia工作,我尝试使用验证控制器来验证一些输入数据,该文件记录在这里:https://aurelia.io/docs/plugins/validation#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”函数一旦运行就被“ await”视为完成,并且不等待“ validateEntry”中的“ validate()”函数的诺言得到解决。我是否可以像这样简单地编写并进行一些修改,但仍然可以使它正常工作?
答案 0 :(得分:2)
您必须从validateEntry
退回承诺:
function validateEntry(item){
return controller.validate(item, "some value", "some rule")
}
不需要then
只是返回其参数,它什么也不做,因此可以删除.then(result => { return result; })
。
async
的{{1}}回调不会使forEach
等待验证。您必须等待所有Promises都解决,然后从ValidateAll
返回Promise,ValidateAll
可以用forEach
代替,这样就无需手动执行推送:
map
这里不需要let validationResults = new Array();
validationResults = InputDataMap.map(item => validateEntry(item));
,因为这里不需要async
。现在await
包含一个Promises列表。现在,您需要使用validationResults
等到解决为止。
Promise.all
现在function ValidateAll(InputDataMap){
let validationResults = InputDataMap.map(item => validateEntry(item));
return Promise.all(validationResults);
}
将返回一个Promise,该Promise将使用包含验证结果的数组进行解析。
您甚至可以将代码缩短为:
ValidateAll
答案 1 :(得分:1)
我了解到,如果您使用async / await关键字,它将暂停一个功能,直到承诺被解决为止,因此我进行了更改,如下所示:
实际上,它确实暂停了该功能,但是async(item) => {//Code}
是不受外部功能影响的另一个功能
async function ValidateAll(InputDataMap){
let validationResults = [];
for (item of InputDataMap) {
let result = await validateEntry(item);
validationResults.push(result);
}
return validationResults;
});
还要注意函数声明前面的async
关键字,这意味着您必须通过let results = await ValidateAll(inputData)
或类似ValidateAll(inputData).then(results => {//Code})
的方式使用它
function ValidateAll(InputDataMap){
return Promise.all(InputDataMap.map(item => validateEntry(item)))
});
答案 2 :(得分:1)
您必须返回一个Promise,其中包含所有异步操作,如下所示:
function ValidateAll(InputDataMap) {
return Promise.all(InputDataMap.map(item => validateEntry(item)));
}