【问题标题】: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 不是同步的。

【问题讨论】:

  • 我猜你的意思是说“同步”而不是异步
  • 我希望避免列出所有 10 个承诺。然后似乎我必须遍历数组并检查是否有任何错误。是的,我的意思是同步的。
  • 所以你仍然可以循环播放。将它们映射到数组

标签: javascript forms promise formvalidation.io


【解决方案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)
    猜你喜欢
    • 2020-08-16
    • 2020-03-07
    • 1970-01-01
    • 2014-02-18
    • 2015-12-18
    • 2021-09-07
    • 2018-03-25
    • 2018-10-13
    • 2015-11-27
    相关资源
    最近更新 更多