遍历承诺
Looping through promises
我正在尝试使用 formvalidation.io 验证 10 个表单域。如果 10 次验证中有任何一次失败,我需要 return false。但是,要访问验证是否已通过,您需要调用一个承诺。
var otherFacilityFields = [
"addressLine1",
"city"
];
fieldsPass = otherFacilityFields.every(function(field) {
fv.validateField(field).then(function(status) {
if (status != 'Valid') {
return false;
}
return true;
});
});
上面的方法不起作用,因为 promise 不是同步的。
如果你正在使用 javascript 有 async 和 await 你可以做类似
fieldsPass = otherFacilityFields.every(async function(field) {
let status = await fv.validateField(field)
if (status != 'Valid') {
return false;
}
return true;
});
或者您可以使用 Promise.all()
尝试一些解决方案
或者你可以使用像
这样的全局变量
let valid = true
let length = otherFacilityFields.length
fieldsPass = otherFacilityFields.every(function(field) {
fv.validateField(field).then(function(status) {
if (status != 'Valid') {
valid = false;
}
valid = true;
length = length - 1
if(length == 0)
//return the valid value
});
});
您可以map
over your fields to create an array of promises. Use Promise.all
to wait for those promises to resolve and then use every
检查每个验证的响应状态。
我在这里使用了 async
/await
,但 Promise.all(promises).then
也同样有效。我还模拟了一个演示验证例程,因此您可以看到它的实际效果。只需将解析从 'Valid' 更改为 'Invalid' 并重新运行演示即可看到 allValid
等于 false
.
const fv = {
validateField() {
return new Promise(resolve => {
setTimeout(() => resolve('Valid'), 1000);
});
}
}
const otherFacilityFields = ['addressLine1', 'city'];
// `map` over the fields and return a
// validation promise for each
const promises = otherFacilityFields.map(field => {
return fv.validateField(field);
});
(async () => {
try {
// await the promises to all resolve
const res = await Promise.all(promises);
// Use `every` to check the status of each validation
const allValid = res.every(status => status === 'Valid');
console.log(allValid);
} catch (e) {
console.log(e);
}
})();
我正在尝试使用 formvalidation.io 验证 10 个表单域。如果 10 次验证中有任何一次失败,我需要 return false。但是,要访问验证是否已通过,您需要调用一个承诺。
var otherFacilityFields = [
"addressLine1",
"city"
];
fieldsPass = otherFacilityFields.every(function(field) {
fv.validateField(field).then(function(status) {
if (status != 'Valid') {
return false;
}
return true;
});
});
上面的方法不起作用,因为 promise 不是同步的。
如果你正在使用 javascript 有 async 和 await 你可以做类似
fieldsPass = otherFacilityFields.every(async function(field) {
let status = await fv.validateField(field)
if (status != 'Valid') {
return false;
}
return true;
});
或者您可以使用 Promise.all()
尝试一些解决方案
或者你可以使用像
let valid = true
let length = otherFacilityFields.length
fieldsPass = otherFacilityFields.every(function(field) {
fv.validateField(field).then(function(status) {
if (status != 'Valid') {
valid = false;
}
valid = true;
length = length - 1
if(length == 0)
//return the valid value
});
});
您可以map
over your fields to create an array of promises. Use Promise.all
to wait for those promises to resolve and then use every
检查每个验证的响应状态。
我在这里使用了 async
/await
,但 Promise.all(promises).then
也同样有效。我还模拟了一个演示验证例程,因此您可以看到它的实际效果。只需将解析从 'Valid' 更改为 'Invalid' 并重新运行演示即可看到 allValid
等于 false
.
const fv = {
validateField() {
return new Promise(resolve => {
setTimeout(() => resolve('Valid'), 1000);
});
}
}
const otherFacilityFields = ['addressLine1', 'city'];
// `map` over the fields and return a
// validation promise for each
const promises = otherFacilityFields.map(field => {
return fv.validateField(field);
});
(async () => {
try {
// await the promises to all resolve
const res = await Promise.all(promises);
// Use `every` to check the status of each validation
const allValid = res.every(status => status === 'Valid');
console.log(allValid);
} catch (e) {
console.log(e);
}
})();