Как вернуть значение в mobx, вычисленное с помощью $.ajax jquery с помощью обратного вызова?

#javascript #jquery #mobx

Вопрос:

В моем проекте у меня есть следующий магазин mobx:

 class AvailabilityCallendar {
  @observable selected_date = new Date();
  @observable max_persons = 2;
  @observable loading = false;

  @computed get availableDates() {
    $.ajax({
      url:
        createUrl('/calendar/availability')  
        'persons='  
        this.max_persons  
        'amp;'  
        selected_date.format('yy-m-d'),
      type: 'GET',
      beforeSend: function () {
        this.loading = true;
      },
      success: function (data) {
        // return value here
      },
      fail: function (jqXHR, textStatus, errorThrown) {
        this.loading = false;
        console.error('Error: '   errorThrown   ', Status: '   textStatus);
      },
    });
  }
}

 

Но в этом случае я знаю, как я могу вернуть значение из успешного обратного вызова ajax.
Ты знаешь, как это сделать?

Ответ №1:

Вы можете вернуться Promise сюда, но я не буду рекомендовать это, потому что вы нарушаете правила вычисляемых значений.

Вычисленные значения не должны иметь побочных эффектов и не должны обновлять другие наблюдаемые значения.

Ответ №2:

computed значения mobx-это «представление» над другим наблюдаемым элементом. Это должна быть операция синхронизации, поэтому ваша реализация неверна.

Что вам нужно, так это простой observable и асинхронный метод, который обновит его значение.

 // pseudo code

class AvailabilityCallendar {
  @observable selected_date = new Date();
  @observable max_persons = 2;
  @observable loading = false;
  @observable availableDate = null; // initial value, it may be any valid js value.

  async getAvailableDate() {
    $.ajax({
      url:
        createUrl('/calendar/availability')  
        'persons='  
        this.max_persons  
        'amp;'  
        selected_date.format('yy-m-d'),
      type: 'GET',
      beforeSend: function () {
        this.loading = true;
      },
      success: function (data) {
        this.availableDate = data // this assignment will trigger all the observers of the observable field.
      },
      fail: function (jqXHR, textStatus, errorThrown) {
        this.loading = false;
        console.error('Error: '   errorThrown   ', Status: '   textStatus);
      },
    });
  }
}
 

Тогда позвони getAvailableDate()

Комментарии:

1. Я думаю, что это должно быть действие mobx @.