【问题标题】:Vues.js . async/await not working as expectedVue.js 。异步/等待未按预期工作
【发布时间】:2019-04-07 11:20:17
【问题描述】:

即使这个方法看起来运行正确,控制台日志显示最终的 RESULt 是在内部等待/同步之前输出的

    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

我的嵌套等待/同步出了什么问题... 感谢反馈

【问题讨论】:

  • 您需要在 validateAndSend 之前等待

标签: javascript vue.js promise async-await


【解决方案1】:

validateAndSend 立即返回承诺。

改变:

const result = validateAndSend(); 

进入:

const result = await validateAndSend(); 

(并在 submitForm 中添加 async

在记录结果之前等待承诺完成。

【讨论】:

  • 在 validateAndSend() 之前添加 await 会引发语法错误:await 是保留字 (158:21)...
  • 我的错:我也(如您所建议的)将异步添加到 submitForm 中。解决了 。我现在明白了。提交 ! app.js:3238 表单已验证... isValid: false app.js:3321 INVALID FORM app.js:3346 RESULT: false
【解决方案2】:

去掉 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
}

【讨论】:

  • 知道了...这么简单
猜你喜欢
  • 2019-04-19
  • 2020-03-04
  • 2022-01-22
  • 2018-12-02
  • 1970-01-01
  • 2021-07-15
  • 2021-12-08
  • 2023-03-03
  • 2019-08-31
相关资源
最近更新 更多