Я ищу хороший подход к , иногда , чтобы приостановить действие (вызов функции / метода), пока пользователь не подтвердит, что он хочет выполнить определенную часть этого действия.Мне нужно сделать это в среде, которая не позволяет остановить выполнение кода (в моем случае ActionScript, но подход для JavaScript должен быть идентичным).
Для иллюстрации это макетдействие перед вводом пользовательской подсказки:
<preliminary-phase> // this contains data needed by all the following phases //
<mandatory-phase> // this will be always be executed //
<optional-phase> // this will always execute too, if in this form, but in some cases we need to ask the user if he wants to do it //
<ending-phase> // also mandatory //
Что мне нужно, это вставить условное приглашение пользователя, «Хотите ли вы выполнить эту часть?», И делать <optional-phase>
только если пользователь хочет.
<preliminary-phase>
<mandatory-phase>
if(<user-confirmation-is-needed> and not <user-response-is-positive>){
<do-nothing>
}
else{
<optional-phase>
}
<ending-phase>
При попытке сделать это в ActionScript / JavaScript у меня получилось что-то вроде этого:
<preliminary-phase>
<mandatory-phase>
if(<user-confirmation-is-needed>){
askForConfirmation(callback = function(){
if(<user-response-is-positive>)
<optional-phase>
<ending-phase>
});
return;
}
<optional-phase>
<ending-phase>
Теперь и 1015 *, и <ending-phase>
дублированы.Кроме того, поскольку они используют объекты, созданные в <preliminary-phase>
, я не могу переместить их во внешние функции, не передав все данные этим функциям.
Мое текущее решение состоит в том, что я включил каждый из <optional-phase>
и <ending-phase>
в некоторые локальные функции (чтобы они имели доступ к данным в <preliminary-phase>
), объявленные до того, как я запросил подтверждение и вызвал эти функциивместо того, чтобы дублировать код, но кажется неправильным, что код уже не в том порядке, в котором он выполняется.
Что бы вы порекомендовали, ребята?
Примечания:
1. askForConfirmation
- это неблокирующая функция.Это означает, что код, который следует за его вызовом, выполняется немедленно (вот почему у меня есть return;
в моем подходе).