代码之家  ›  专栏  ›  技术社区  ›  user762579

Vues.js公司。异步/等待未按预期工作

  •  0
  • user762579  · 技术社区  · 7 年前

    即使这个方法看起来运行正常,控制台日志也会显示最终结果是在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
    

    等待反馈

    2 回复  |  直到 7 年前
        1
  •  1
  •   Bob Fanger    7 年前

    validateAndSend立即返回承诺。

    const result = validateAndSend(); 
    

    分为:

    const result = await validateAndSend(); 
    

    (并添加 async 提交表格)

        2
  •  0
  •   Vladislav Ladicky    7 年前

    删除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
    }