Добавление реализации в 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.');
}
});