Vues.js. async / await не работает должным образом - PullRequest
0 голосов
/ 03 ноября 2018

Даже если этот метод настроен на корректную работу, журнал консоли показывает, что окончательный РЕЗУЛЬТАТ выводится раньше, чем inned await / sync

    submitForm: function() {
      console.log("SUBMIT !");
      // vee-validate form validation request
      const makeValidationRequest = () => {
        return this.$validator.validateAll();
      };
      const validateAndSend = async () => {
        const isValid = await makeValidationRequest();
        console.log("form validated... isValid: ", isValid);
        if (isValid) {
          console.log("VALID FORM");
          // axios post request parameters
          const data = { ... }
          };
          const axiosConfig = {
            headers: { ... }
          };
          const contactAxiosUrl = "...";
          // send axios post request
          const makeAxiosPostRequest = async (url, data, config) => {
            try {
              const result = await axios.post(url, data, config);
              console.log("axios post request result: ", result);
              return true;
            } catch (err) {
              console.log("axios post request: ", err.message);
              return false;
            }
          };
          this.$store.dispatch("switchLoading", true);
          const sent = await makeAxiosPostRequest( contactAxiosUrl, contactAxiosData, axiosConfig );
          this.$store.dispatch("switchLoading", false);
          return sent;
        } else {
          console.log("INVALID FORM");
          return false;
        }
      };
      const result = validateAndSend();
      console.log("RESULT: ", result);
    },

the console log is :

    SUBMIT !
    app.js:3312 RESULT:  Promise {<pending>}__proto__: Promisecatch: ƒ catch()constructor: ƒ Promise()finally: ƒ finally()then: ƒ then()arguments: (...)caller: (...)length: 2name: "then"__proto__: ƒ ()[[Scopes]]: Scopes[0]Symbol(Symbol.toStringTag): "Promise"__proto__: Object[[PromiseStatus]]: "resolved"[[PromiseValue]]: false
    app.js:3209 form validated... isValid:  false
    app.js:3291 INVALID FORM

Обычно я должен получить:

 SUBMIT !
 form validated... isValid:  false
 INVALID FORM

и, наконец,

 RESULT

Что не так с моим вложенным awaut / sync ... спасибо за отзыв

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Удалите функцию makeValidationRequest, это ненужно и неправильно. Попробуйте это:

submitForm: async function () {
  // get form validation status
  let formIsValid = await this.$validator.validateAll()

  let url = ''
  let formData = {}
  let config = {
    headers: {}
  }

  const postData = async (url, dta, cnf) => {
    try {
      // first, show loader
      this.$store.dispatch('switchLoading', true)
      // then try to get response.data
      let {data} = await axios.post(url, dta, cnf)
      // if successful, just console it
      console.log(`form post successful: ${data}`)
    } catch (err) {
      // if unsuccessful, console it too
      console.log(`error posting data: ${err}`)
    } finally {
      // successful or not, always hide loader
      this.$store.dispatch('switchLoading', false)
    }
  }

  formIsValid && postData(url, formData, config)
  // else not required, you can't submit invalid form
}
0 голосов
/ 03 ноября 2018

validateAndSend мгновенно возвращает обещание.

изменение:

const result = validateAndSend(); 

в

const result = await validateAndSend(); 

(и добавьте async к submitForm)

Чтобы дождаться выполнения обещания, прежде чем регистрировать результат.

...