Добавление реализации в Promise.resolve

Я хочу создать небольшой скрипт, чтобы проверить, действительна модель или нет с помощью isValid метод вместо then метод.

Вот скрипт, использующий then метод:

$('button').click(function () {
  let model = Promise.resolve({
    then(x, y) {
      let isValid = $('input[type=text]').val().length > 0;
      x(isValid);
    }
  });
  
  model.then(isValid => console.log(isValid));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" />
<button>check</button>

Моя цель:

if (model.isValid()) {
    console.log('model is valid.');
}

Я пробовал:

$('button').click(function () {
  let model = Promise.resolve({
    isValid() {
      let isValid = $('input[type=text]').val().length > 0;
      return isValid;
    }
  });
  
  if (model.isValid()) {
    console.log('model is valid.');
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" />
<button>check</button>

Сообщение об ошибке:

Uncaught TypeError: 'model.isValid' не является функцией

Мой вопрос: как я могу определить isValid функция в этом случае?

2 ответа

Решение

Вы вторая реализация получаете эту ошибку времени выполнения, потому что Promise.resolve возвращает:

объект Promise, который разрешается с заданным значением. Если значение является thenable (то есть имеет метод then), возвращаемое обещание будет "следовать" за последующим, принимая его возможное состояние; в противном случае возвращенное обещание будет выполнено со значением.

Итак, если вы определите обещание так:

 Promise.resolve({
    isValid() {
      let isValid = $('input[type=text]').val().length > 0;
      return isValid;
    }
  }); 

Вы возвращаете объект, который недоступен для просмотра (он не имеет then метод, но isValid один), так что вы не можете просто сделать model.isValid() но ты должен:

$('button').click(function () {
  let model = Promise.resolve({
    isValid() {
      let isValid = $('input[type=text]').val().length > 0;
      return isValid;
    }
  });
  
  model.then(res => {
      if (res.isValid()) {
        console.log('model is valid.');
      }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" />
<button>check</button>

Итак, зачем вам нужно использовать Promise? Для вашего примера это проще

$('button').click(function () {
  let isValid = $('input[type=text]').val().length > 0;
  if (isValid) {
     console.log('model is valid.');
  }
});
Другие вопросы по тегам