Рекурсивная функция подсказки возвращает ноль - PullRequest
0 голосов
/ 03 января 2019

Я хочу создать функцию подсказки, которая будет запрашивать до тех пор, пока пользователь не введет значение, а затем вернет это значение.

Почему этот код возвращает ноль , когда я вхожу в обязательный режим и затем ввожуценность?Кто-нибудь может заставить его работать?

function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';
  if (typeof mandantory === 'undefined')
    return prompt(text, defaultText);
  else {
    var a = prompt(text, defaultText);
    if (a === '') {
      return UserInput(text, defaultText, mandantory);
    } else {
      return null;   
    }
  }
}
<!DOCTYPE html>
<html>
	<head>
		<title>Page Title</title>
	</head>
	<body>
		<button onclick="alert(UserInput('prompt with input', ''))">prompt with input</button><br/>
		<button onclick="alert(UserInput('prompt with mandantory input', '', 0))">prompt with mandantory input</button>
	</body>
</html>

Примечание: он должен вызываться из onclick = "...".

Спасибо, Dejan

Ответы [ 4 ]

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

Вы можете сделать это

function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';
  if (typeof mandantory === 'undefined')
    return prompt(text, defaultText);
  else {
    var a = prompt(text, defaultText);
    if (a === '') {
      return UserInput(text, defaultText, mandantory);
    } else if (a !== null) {
      return a;   
    } else {
      return null;   
    }
  }
}
<!DOCTYPE html>
<html>
	<head>
		<title>Page Title</title>
	</head>
	<body>
		<button onclick="alert(UserInput('prompt with input', ''))">prompt with input</button><br/>
		<button onclick="alert(UserInput('prompt with mandantory input', '', 0))">prompt with mandantory input</button>
	</body>
</html>
0 голосов
/ 03 января 2019

Он возвращает null, потому что вы возвращаете его в else, если введено значение. В вашем последнем else вам нужно вернуть a вместо null, когда a отличается от '':

if (a === '') {
  return UserInput(text, defaultText, mandantory);
} else {
  return a;   
}

Примечание:

Чтобы проверить, определена ли переменная, вы можете просто использовать if(mandatory) вместо записи if(typeof mandantory === 'undefined').

Демо-версия:

function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';
  if (mandantory)
    return prompt(text, defaultText);
  else {
    var a = prompt(text, defaultText);
    if (a === '') {
      return UserInput(text, defaultText, mandantory);
    } else {
      return a;   
    }
  }
}
<!DOCTYPE html>
<html>
	<head>
		<title>Page Title</title>
	</head>
	<body>
		<button onclick="alert(UserInput('prompt with input', ''))">prompt with input</button><br/>
		<button onclick="alert(UserInput('prompt with mandantory input', '', 0))">prompt with mandantory input</button>
	</body>
</html>
0 голосов
/ 03 января 2019

В вашем фрагменте:

  1. если a не ноль, то всегда возвращать null, тогда как return a
  2. нет необходимости в else ветке, если есть return операторов
  3. Вы можете использовать параметры по умолчанию
  4. Обязательный (опечатка) => n
  5. Следует избегать множественных ветвей, возвращающих одно и то же значение

Вы можете написать функцию, подобную следующей:

const UserInput = async (text, defaultText = '', mandatory = false) => {
  const result = await prompt(text, defaultText);
  
  if (!result && mandatory) {
    console.log('User did not enter a correct value, try again');
    return UserInput(text, defaultText, mandatory);
  }
  
  console.log(`Returning Value: "${result}"`);
  return result;
};

document
  .getElementById('test')
  .addEventListener('click', () => UserInput('Say Something', '', true))
;
<button id="test">Try</button>
0 голосов
/ 03 января 2019

Возвращает null, потому что вы звоните, набираете return null, если a - это что-то еще '', вы должны вернуть a.

function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';
  if (typeof mandantory === 'undefined')
    return prompt(text, defaultText);
  else {
    var a = prompt(text, defaultText);
    if (a === '') {
      return UserInput(text, defaultText, mandantory);
    } else {
      return a;
    }
  }
}
<!DOCTYPE html>
<html>

<head>
  <title>Page Title</title>
</head>

<body>
  <button onclick="alert(UserInput('prompt with input', ''))">prompt with input</button><br/>
  <button onclick="alert(UserInput('prompt with mandantory input', '', 0))">prompt with mandantory input</button>
</body>

</html>

Но я бы использовал цикл while do while вместо рекурсии здесь:

function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';

  var a

  do {
    // the first prompt will always be called
    a = prompt(text, defaultText)
    // repeat the loop while  a === '' and mandantory !== 'undefined'
  } while (mandantory !== 'undefined' && a === '')

  return a;
}
<!DOCTYPE html>
<html>

<head>
  <title>Page Title</title>
</head>

<body>
  <button onclick="alert(UserInput('prompt with input', ''))">prompt with input</button><br/>
  <button onclick="alert(UserInput('prompt with mandantory input', '', 0))">prompt with mandantory input</button>
</body>

</html>
...