Вот пример, который, как мы надеемся, облегчит понимание вопроса.
var listen = document.querySelector("#listen"),
cancel = document.querySelector("#cancel"),
submit = document.querySelector("#submit");
var promiseResolve = null;
listen.addEventListener("click", startListening);
cancel.addEventListener("click", abort);
submit.addEventListener("click", onSubmitClick);
submit.disabled = true;
function startListening() {
submit.disabled = false;
listen.disabled = true;
new Promise(function(resolve) {
promiseResolve = resolve;
}).then(onSubmit);
}
function abort() {
listen.disabled = false;
submit.disabled = true;
promiseResolve = null;
}
function onSubmitClick() {
if (promiseResolve) promiseResolve();
}
function onSubmit() {
console.log("Done");
abort();
}
<button id="listen">Listen</button>
<button id="submit">Submit</button>
<button id="cancel">Cancel</button>
В приведенном выше сценарии есть действие (listen
), которое активирует другое действие (submit
) с помощью Promise
,Но этот поток можно отменить с помощью действия cancel
, возвращающего большую часть кода в исходное состояние.Действие cancel
только устанавливает нулевую ссылку resolve
из Promise
, означая, что обещание навсегда останется в подвешенном состоянии, поскольку оно никогда не будет разрешено или отклонено.Вот мои вопросы:
- Правильно ли подходит этот подход?
- Будет ли выполнение этого большого количества раз занимать такое же большое количество ресурсов?
- Должен ли я также сохранить ссылку на функцию отклонения и вызвать ее в действии
cancel
?
Я знаю, что в приведенном выше примере того же результата можно достичь, просто используя флаг boolean
, чтобы проверить, была ли нажата кнопка прослушивания перед отправкой, но, как я уже сказал, это простопример, чтобы я мог легче объяснить вопрос.