Работа с забытыми обещаниями в JavaScript - PullRequest
0 голосов
/ 28 января 2019

Вот пример, который, как мы надеемся, облегчит понимание вопроса.

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, чтобы проверить, была ли нажата кнопка прослушивания перед отправкой, но, как я уже сказал, это простопример, чтобы я мог легче объяснить вопрос.

1 Ответ

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

Как уже упоминалось в этом ответе;

Большая часть кода, использующего обещания, ожидает их разрешения или отклонения в некоторый момент в будущем (поэтому обещания используются в первомместо).Если они этого не делают, то этот код, как правило, никогда не завершает свою работу.

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

Не удается разрешить илиОтклонение обещания не вызывает проблем в Javascript, но в любом случае это плохая практика.Ваша заявка не может определить, что случилось с обещанием, если оно никогда не разрешится.Вместо того, чтобы оставлять обещание в подвешенном состоянии, верните значение, подобное сообщению об ошибке, и получите фильтр обещаний для сообщения об ошибке.Если он обнаружит ошибку, отклоните () обещание, чтобы приложение могло определить свой следующий ход.

var listen = document.querySelector("#listen"),
  cancel = document.querySelector("#cancel"),
  submit = document.querySelector("#submit");

var promiseResolve = null;

listen.addEventListener("click", startListening);
cancel.addEventListener("click", onCancelClick);
submit.addEventListener("click", onSubmitClick);
submit.disabled = true;

function startListening() {
  submit.disabled = false;
  listen.disabled = true;
  new Promise(function(resolve, reject) {
    promiseResolve = (error) => {
       if (error) { reject(error); } else { resolve(); }
    };
  }).then(onSubmit)
  .catch(error => onError(error));
}

function abort() {
  listen.disabled = false;
  submit.disabled = true;
  promiseResolve = null;
}

function onSubmitClick() {
  if (promiseResolve) promiseResolve();
}

function onCancelClick() {
  if (promiseResolve) promiseResolve("Cancelled!");
}

function onSubmit() {
  console.log("Done");
  abort();
}

function onError(error) {
  console.warn(error);
  abort();
}
<button id="listen">Listen</button>
<button id="submit">Submit</button>
<button id="cancel">Cancel</button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...