Перебор обещаний

Я пытаюсь проверить 10 полей формы с помощью formvalidation.io. Если какая-либо из 10 проверок не пройдена, мне нужно вернуть false. Однако, чтобы получить доступ к тому, прошла ли проверка или нет, вам нужно вызвать обещание.

var otherFacilityFields = [
    "addressLine1",
    "city"
];

  fieldsPass = otherFacilityFields.every(function(field) {
    fv.validateField(field).then(function(status) {
        if (status != 'Valid') {
            return false;
        }
        return true;
    });
  });

Вышеприведенное не работает, потому что промисы не синхронны.


person SolidCloudinc    schedule 24.01.2019    source источник
comment
Я думаю, вы хотели сказать синхронный, а не асинхронный   -  person epascarello    schedule 24.01.2019
comment
Я надеялся избежать перечисления всех 10 обещаний. Тогда кажется, что мне придется перебирать массив и проверять, не были ли они ложными. Да, я имел в виду синхронный.   -  person SolidCloudinc    schedule 24.01.2019
comment
так что можно еще зациклиться. Сопоставьте их с массивом   -  person epascarello    schedule 24.01.2019


Ответы (2)


Вы можете 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);
  }
})();

person Andy    schedule 24.01.2019

если вы используете javascript, имеет асинхронность и ждете, вы можете сделать что-то вроде

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
    });
  });

person Zhang Bruce    schedule 24.01.2019
comment
Глобальный? Как это поможет? Вам все еще нужно знать, когда все они будут сделаны. Каждый не получит истинного / ложного - person epascarello; 24.01.2019
comment
Все еще не будет работать из-за асинхронности. Может быть, если бы это было для Каждого.... и ты до сих пор не можешь вернуться - person epascarello; 24.01.2019
comment
Я хотел использовать foreach, почему-то я думал, что вы делаете foreach. так почему бы не использовать foreach? - person Zhang Bruce; 24.01.2019
comment
(я не ОП) - person epascarello; 24.01.2019