Нерешенные обещания в проверке формы - PullRequest
0 голосов
/ 03 января 2019

У меня есть функция JS - checkUsername - которая включает вызов Ajax.Он проверяет ввод формы, а также проверяет тот же ввод во время отправки формы:

function checkUsername(id) {
  var userName = $('#' + id).val().trim();
  if(!userName) {
    showErr(id, 'An entry is required.');
    return Promise.resolve(false);
  }
  return $.ajax({
    type: 'POST',               
    data:{'checkUsername': userName},
    url:'/php/ajax/validation-ajax.php',
  })
  .then(function(response) {
    if(response == 'notfound') {
      showErr(id, 'This user is not in the list.');
      return(false);
    }
    else {
      clearErr(id);
      return(true);
    }
  })
  .fail(function(err) {
    // some code
  })
}

В первом случае он вызывается обработчиком события.Во втором он является частью оператора switch:

case 'username':
  checkUsername(id).then(function(data) {
    if(isOK && data !== false) {
      // submit form
      $('form#adminusers').submit();
    }
  });
  break;

В случае отправки формы, я думаю, что обещание функции выполнено правильно.Но, вероятно, когда функция вызывается обработчиком события, обещание остается висеть.

Имеет ли это значение?Даже если я напишу две версии функции, одну для обработчика событий, а другую для отправки формы, версия обработчика событий все равно будет содержать вызов Ajax, поэтому ситуация с обещаниями не будет отличаться.

Как правильно справиться с этой ситуацией?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я думаю, что в вашем случае checkUsername(id) использует функцию ajax, которая уже разрешила все обещания.поэтому возврат ajax будет возвращать только оператор возврата каждой функции, которая будет выполнена как успех или неудача.все обещания разрешаются только там.

Но в случае оператора switch вы вызываете обещание для функции, которая вообще не возвращает обещание.т.е. checkUsername(id).then(function(data) {});

, прежде чем использовать функцию, вы должны сначала убедиться, что функция возвращает обещание.

Итак, ваш checkUsername(id) должен вернуть обещание:

checkUsername(id){
  return new Promise((resolve, reject) => { 
     // do something here
  });
}
0 голосов
/ 03 января 2019

Это зависит.

Самая важная часть заключается в том, что вы полностью выполняете обещание.Обычно, когда вы находите нерешенное обещание, вы на самом деле имеете в виду, что состояние ошибки не разрешено.В вашем конкретном случае в операторе switch это выглядит так, как будто «хорошее» состояние разрешается путем отправки формы, но если в checkUsername или при отправке формы возникнет какая-либо ошибка, она выдаст неразрешенный отказ.

В конечном счете, у вас всегда должно быть .fail() или .catch() - в зависимости от того, какую реализацию Promises вы используете - в конце любой цепочки Promise для обнаружения ошибок, возникающих в любом месте цепочки.Вы можете иметь несколько .. в вашем случае у вас есть .fail() в пределах checkUsername(), который может разрешить обещание этой функции, предположительно с false, но у вас еще должен быть другой в конце, вв случае ошибок при отправке формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...