循环通过承诺
Posted
技术标签:
【中文标题】循环通过承诺【英文标题】:Looping through promises 【发布时间】:2019-06-17 15:36:41 【问题描述】:我正在尝试使用 formvalidation.io 验证 10 个表单字段。如果 10 个验证中的任何一个失败,我需要返回 false。但是,要访问验证是否通过,您需要调用一个 Promise。
var otherFacilityFields = [
"addressLine1",
"city"
];
fieldsPass = otherFacilityFields.every(function(field)
fv.validateField(field).then(function(status)
if (status != 'Valid')
return false;
return true;
);
);
上述方法不起作用,因为 Promise 不是同步的。
【问题讨论】:
developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 我猜你的意思是说“同步”而不是异步 我希望避免列出所有 10 个承诺。然后似乎我必须遍历数组并检查是否有任何错误。是的,我的意思是同步的。 所以你仍然可以循环播放。将它们映射到数组 【参考方案1】:您可以map
在您的字段上创建一个承诺数组。使用Promise.all
等待这些承诺解决,然后然后使用every
检查每个验证的响应状态。
我在这里使用过async
/await
,但Promise.all(promises).then
也同样适用。我还模拟了一个演示验证例程,以便您可以看到它的实际效果。只需将解析从“有效”更改为“无效”并重新运行演示以查看 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);
)();
【讨论】:
【参考方案2】:如果你使用的 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
);
);
【讨论】:
全球?那会有什么帮助?您仍然需要知道所有这些都何时完成。每个人都不会得到真/假 由于是异步的,仍然无法工作。也许如果是 forEach.... 而你仍然无法返回 我是想用foreach,不知怎的,我以为你在做foreach。那么为什么不使用 foreach 呢? (我不是OP)以上是关于循环通过承诺的主要内容,如果未能解决你的问题,请参考以下文章