Как вы используете это для передачи данных всем «подписчикам» - так что, если решение Promise разрешено, я хочу уведомить всех. В настоящее время window.addEventlistener находится вне контекста контекста, и я не могу получить доступ к любым локальным переменным класса или передать данные с помощью и Event (TypeScript)

ожет звучать странно, но я ищу способ выполнить обещание несколько раз. Есть ли подходы, чтобы сделать это возможным?

Подумайте о следующем примере:

getPromise() {
  const event = new Event('myEvent');

  setTimeout(() => {
    window.dispatchEvent(event);
  }, 5000);

  setTimeout(() => {
    window.dispatchEvent(event);
  }, 7000);

  return new Promise((resolve) => {
    window.addEventListener('myEvent', () => {
      resolve('some value'));
    });

    resolve('some value'));
  });
};

А затем .then ():

getPromise().then(data => {console.log(data)})

Должен дать следующий результат:

some value // initial
some value // after 5000ms
some value // after 7000ms

Итак, я знаю, что есть библиотеки для потоковой передачи данных, но я действительно ищу нативный подход без callbak для достижения этой цели.

 Felix Kling26 сент. 2017 г., 03:23
Обещания не могут быть выполнены несколько раз.

Ответы на вопрос(1)

Решение Вопроса

Ты не можешь Обещания могут быть выполнены только один раз. Как только они были решены, они никогда не изменят свое состояние снова. По сути, они являются односторонними конечными автоматами с тремя возможными состояниями, ожидающими, выполненными и отклоненными. Как только они перешли от ожидающих к выполненным или от ожидающих к отклоненным, они не могут быть изменены.

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

Я не знаю, почему вы пытаетесь избежать обратных вызовов в этом случае. Обещания используют обратные вызовы тоже в своих.then() обработчики. Вам понадобится обратный вызов где-нибудь, чтобы ваше решение работало. Можете ли вы объяснить, почему вы не просто используетеwindow.addEventListener('myEvent', someCallback) напрямую, так как будет делать то, что вы хотите?

Вы могли бы вернуть интерфейс, подобный обещанию (который не соответствует стандартам Promise), который вызывает его обратные вызовы уведомлений более одного раза. Во избежание путаницы с обещаниями я бы не стал использовать.then() как имя метода:

function getNotifier() {
  const event = new Event('myEvent');

  setTimeout(() => {
    window.dispatchEvent(event);
  }, 500);

  setTimeout(() => {
    window.dispatchEvent(event);
  }, 700);

  let callbackList = [];
  const notifier = {
      notify: function(fn) {
          callbackList.push(fn);
      }
  };
  window.addEventListener('myEvent', (data) => {
      // call all registered callbacks
      for (let cb of callbackList) {
          cb(data);
      }
  });
  return notifier;
};

// Usage:
getNotifier().notify(data => {console.log(data.type)})

 Orlandster26 сент. 2017 г., 04:30
ок, спасибо, это круто!
 jfriend0026 сент. 2017 г., 03:56
@ Orlandster - я добавил в свой ответ идею, которая дает интерфейс, похожий на обещание, но не тот же, который будет уведомлять несколько раз.
 Orlandster26 сент. 2017 г., 03:44
Хорошо. Это то, что я ожидал. Я просто хотел убедиться, что есть способ добиться этого. Может быть, обходной путь или что-то. Все функции-члены моей библиотеки возвращают обещания, кроме этого. Поэтому я хотел, чтобы это было похоже. Но, конечно, вы правы, обратный вызов идеально подходит. Так что спасибо за ваши усилия!
 Drenai13 февр. 2018 г., 20:49
Observables (rxjs) делают именно эту вещь
 ppumkin04 февр. 2019 г., 16:39
Как вы используете это для передачи данных всем «подписчикам» - так что, если решение Promise разрешено, я хочу уведомить всех. В настоящее время window.addEventlistener находится вне контекста контекста, и я не могу получить доступ к любым локальным переменным класса или передать данные с помощью и Event (TypeScript)

Ваш ответ на вопрос