Как получить окончательный ответ от класса javascript после его завершения - PullRequest
0 голосов
/ 04 апреля 2020

Я написал javascript класс для заполнения форм данными. Однако, если есть оставленные входные данные, которые не были помещены в форму, я бы хотел, чтобы они возвращались в ответе. Как получить остаток json после заполнения формы.

Класс

 class Deserialize 
    {
        constructor(o)
        {
            this.o = o;
            this.leftovers = null;
            this.get();
            return new Promise((resolve,reject) => {

            resolve(this.leftovers);
        });
    }

    get()
    {
        console.log(1);
        let parent = this;
        return axios.get(this.o.url).then(function(response) {
            parent.o.data = response.data;
            console.log(2);
            parent.populate();
        });
    }

    populate()
    {
        console.log(3);
        let parent = this;
        let inputs = document.querySelectorAll(this.o.form + ' input, ' + this.o.form + ' textarea, ' + this.o.form + ' select');

        inputs.forEach(function(v, i) {
            let name = v.name;
            let type = v.type;
            let data = parent.o.data;

            Object.keys(data).forEach(function(i) {
                if (i == name) {
                    switch (type) {
                        case 'checkbox':
                            v.checked = true;
                        break;
                        case 'radio':
                            if (v.value == data[i]) v.checked = true;
                        break;  
                        case 'select-one':
                        case 'textarea':
                        case 'text':
                        case 'tel':
                        case 'date':
                        case 'time':
                        case 'email':
                        case 'hidden':
                        case 'password': 
                        case 'color':
                            v.value = data[i];
                        break;
                    }

                    delete parent.o.data[i];
                }
            }); 
        });

        this.leftovers = parent.o.data;
    }
}

Я инициализирую так

const deserialize = new Deserialize({
    form: '#account-form',
    url: '/account/getAccountJson/'
}).then(function(response) {
    console.log(response);
});

Как получить оставшиеся вводы после заполнения формы?

1 Ответ

1 голос
/ 04 апреля 2020

Вы можете упростить это.

class Deserialize {
  constructor(o) {
    this.o = o;
    this.leftovers = null;
    return this.get();
  }

  get() {
    console.log(1);
    let parent = this;
    return axios.get(this.o.url).then((response) =>{
      parent.o.data = response.data;
      return parent.populate();
    });
  }

   async populate() {
    console.log(3);
    // Rest of the code
    this.leftovers = parent.o.data;
   return this.leftovers;
  }
}

Не выполнять асинхронный вызов c в constructor. Anti pattern.

class Deserialize {
  constructor(options) {
    this.options = options;
    this.leftovers = [];
  }
  get() {
    return axios.get(this.options.url).then((response) => {
      this.options.data = response.data;
      return this.populate();
    });
  }
  populate() {
    let inputs = document.querySelectorAll(
      this.options.form +
        " input, " +
        this.options.form +
        " textarea, " +
        this.options.form +
        " select"
    );
    inputs.forEach((v, i) => {
      let name = v.name;
      let type = v.type;
      let data = this.options.data;
      data.forEach((i) => {
        if (i == name) {
          switch (type) {
            case "checkbox":
              v.checked = true;
              break;
            case "radio":
              if (v.value == data[i]) v.checked = true;
              break;
            case "select-one":
            case "textarea":
            case "text":
            case "tel":
            case "date":
            case "time":
            case "email":
            case "hidden":
            case "password":
            case "color":
              v.value = data[i];
              break;
          }
        } else {
          this.leftovers.push(this.options.data[i]);
        }
      });
    });
    return this.leftovers;
  }
}

const deserialize = new Deserialize({
  form: "#account-form",
  url: "/account/getAccountJson/",
})
  .get()
  .then(function (response) {
    console.log(response);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...