named promise chainy для обычных обещаний, обрабатывающих события

Я пытаюсь создать именованную цепочку обещаний. Я не уверен, как этого добиться. Цель следующая:

        function multiplepromises() {
            var prom = function (resolve, reject) {
                var lifecycleeventone = new someEvent();
                var lifecycleeventtwo = new someEvent();
                var lifecycleeventthree = new someEvent();
                var lifecycleeventfour = new someEvent();
                var lifecycleeventfive = new someEvent();

                lifecycleeventone.on(function () {
                    try {
                        resolve("eventone")
                    } catch {
                        reject("eventone")
                    }
                })
                lifecycleeventtwo.on(function () {
                    try {
                        resolve("eventtwo")
                    } catch {
                        reject("eventtwo")
                    }
                })
                lifecycleeventthree.on(function () {
                    try {
                        resolve("eventthree")
                    } catch {
                        reject("eventthree")
                    }
                })
                lifecycleeventfour.on(function () {
                    try {
                        resolve("eventfour")
                    } catch {
                        reject("eventfour")
                    }
                })
                lifecycleeventfive.on(function () {
                    try {
                        resolve("eventfive")
                    } catch {
                        reject("eventfive")
                    }
                })
                maineventlikefinallySOcalledalways.on(function(){
                    try {
                        resolve("maineventlikefinallySOcalledalways")
                    } catch {
                        reject("maineventlikefinallySOcalledalways")
                    }
                })
            }
            return prom
        }
        
        multiplepromises()
        .onlifecycleeventoneAsProm((result)=> result) //eventone promise resolve
        .onlifecycleeventoneerrorAsProm((error)=> error) //eventone
        .onlifecycleeventtwoAsProm((result)=> result) //eventtwo promise resolve
        .onlifecycleeventtwoerrorAsProm((error)=> error) //eventtwo
        .onlifecycleeventthreeAsProm((result)=> result) //eventthree promise resolve
        .onlifecycleeventthreeerrorAsProm((error)=> error) //eventthree
        .onlifecycleeventfourAsProm((result)=> result) //eventfour promise resolve
        .onlifecycleeventfourerrorAsProm((error)=> error) //eventfour
        .onlifecycleeventfiveAsProm((result)=> result) // eventfive promise resolve
        .onlifecycleeventfiveerrorAsProm((error)=> error) //eventfive
        .then((result)=> result) // maineventlikefinallySOcalledalways promise resolve
        .error((error)=> error) // maineventlikefinallySOcalledalways promise reject
        

    multiplepromises()
            .onlifecycleeventoneAsProm((result)=> result) //eventone promise resolve
            .onlifecycleeventoneerrorAsProm((error)=> error) //eventone
            .onlifecycleeventtwoAsProm((result)=> result) //eventtwo promise resolve
            .onlifecycleeventtwoerrorAsProm((error)=> error) //eventtwo
            .onlifecycleeventthreeAsProm((result)=> console.log("test")) 
// lifecycleeventthree promise reject stops here and 
// doesnt continue to .then/.error since there was no return from this lifecycle event(promise)
    

Я прочитал это, и это не решает цель полностью. Обработка нескольких уловов в цепочке обещаний и https://javascript.info/promise-chaining

Не хотите использовать Rx и хотите придерживаться vanilla js


person Gary    schedule 02.09.2020    source источник
comment
что такое функции oneventoneAsProm и oneventoneerrorAsProm и т. д.?   -  person Jaromanda X    schedule 02.09.2020
comment
кроме того, ваш код multipromises будет пытаться разрешить/отклонить одно обещание более одного раза... это невозможно... как только обещание будет разрешено или отклонено, оно не может быть разрешено или отклонено снова   -  person Jaromanda X    schedule 02.09.2020
comment
@JaromandaX Нет, они разрешают отклонить событие. eventtwo.on (функция () { попытка { разрешить (событие) } поймать { отклонить (событие) } })   -  person Gary    schedule 02.09.2020
comment
также ваша попытка/поймать никогда не потерпит неудачу, так как функция resolve не потерпит неудачу, поэтому код не имеет смысла   -  person Jaromanda X    schedule 02.09.2020
comment
Итак, только одно событие в этом списке событий когда-либо сработает? никогда больше одного? потому что события не resolve/reject ... они разрешают (и никогда не отклонят по вышеуказанной причине) одно единственное обещание, созданное в верхней части кода   -  person Jaromanda X    schedule 02.09.2020
comment
@JaromandaX function asyncFunc() { const eventEmitter = { success: [] }; setTimeout(() => { // (A) for (const handler of eventEmitter.success) { handler('DONE'); } }, 100); return eventEmitter; } asyncFunc() .success.push(x => console.log('Result: '+x)); Это то, чего я хочу добиться, но этот .success должен быть обещанием, а не событием. Не уверен, что я говорю мусор. Но я хочу знать, возможно ли это, или я буду излишне усложнять код   -  person Gary    schedule 02.09.2020
comment
@JaromandaX Все события не произойдут. Но промис maineventlikefinallySO, называемый всегда, будет тем, который нужно зафиксировать в промисах then и .error. Другие события eventone и т. д. будут необязательными в течение жизненного цикла кода/набора действий.   -  person Gary    schedule 02.09.2020
comment
Тогда ваш код ошибочен, так как обещание может быть разрешено только ОДИН РАЗ — у вас есть одно обещание, и ваш код попытается решить это обещание более одного раза.   -  person Jaromanda X    schedule 02.09.2020
comment
ваш код в комментарии имеет еще меньше смысла ... где вообще определено asyncFunc().success?   -  person Jaromanda X    schedule 02.09.2020
comment
Давайте продолжим обсуждение в чате.   -  person Gary    schedule 02.09.2020
comment
К сожалению, ваш код настолько скуден в деталях, что он также не помогает описать ваши требования... пожалуйста, попробуйте описать, чего вы хотите, чтобы ваш код достиг.   -  person Jaromanda X    schedule 02.09.2020
comment
Я только что обновил код для требований. Наверное, это чище для понимания   -  person Gary    schedule 02.09.2020
comment
нет, это не так, поскольку ваш код по-прежнему будет пытаться разрешить одно и то же обещание несколько раз, И у вас есть бессмысленные блоки try/catch, поскольку ничего в попытке не будет выброшено - и изменение имен несуществующих свойств этой функции с oneventoneAsProm до onlifecycleeventoneAsProm ничего не проясняет - этих функций не существует ... для чего они предназначены?   -  person Jaromanda X    schedule 02.09.2020


Ответы (1)


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

Вот простой пример:

function test() {
  return new (function() {
    this.eh = {};
    
    this.on = (event, handler) => {
      this.eh[event] = handler;
      return this;
    }
    
    this.call = (event, ...args) => {
      if (typeof this.eh[event] === 'function') {
        this.eh[event](...args);
      }
    }
    
    Promise.resolve().then(() => {
      // Do your stuff...
      
      // Example:
      this.call('msg', 'This is a message.');
      setTimeout(() => {
        this.call('some-event', 'This is some event data.');
        
        this.call('error', 'This is an error.');
      }, 1000);
      
    });
  })()
}

test()
  .on('msg', (msg) => console.log(`Message: ${msg}`))
  .on('some-event', (data) => console.log(`Some event: ${data}`))
  .on('error', (err) => console.log(`Error: ${err}`))

Надеюсь, это то, что вы задумали.

Изменить:
Вот еще одна попытка: https://jsfiddle.net/bg7oyxau/< /а>

person LPT0    schedule 15.09.2020
comment
Потрясающе поймите суть. Что мне делать с браузерами? Зарегистрировать мероприятие? Я в среде браузера. Я знаю, что могу добиться этого с помощью rxjs lite где-то рядом, но просто хочу этого избежать. Во-вторых, просто хочу знать, конвертирую ли я каждое событие в обещание с помощью утилиты topromise? Пробовали это? Это когда-нибудь сработает? - person Gary; 16.09.2020
comment
@ Гэри Нет, это не сработает. Зачем тебе вообще обещание? Ты смущаешь меня... - person LPT0; 16.09.2020
comment
Хм.. правильно, это меня тоже немного смутило. Но все события являются событиями жизненного цикла. если есть возвращаемое значение (в разрешении или отклонении), следующее событие в цепочке событий продолжается. Иначе останавливается. lifecycleeventthree promise reject stops here and doesnt continue to .then/.error since there was no return from this lifecycle event(promise) Пожалуйста, проверьте второй multiplepromises() агрегат. Это вообще возможно или я пытаюсь что-то невозможное? Логически: то, что я пытаюсь, - это просто next() тик для следующей цепочки событий, будь то ошибка или завершение в предыдущем событии жизненного цикла. - person Gary; 17.09.2020
comment
Наверное, я тут туплю, если подумать. Однако я видел последовательные события жизненного цикла. Возможно, я просто смешиваю обещания и события без необходимости. - person Gary; 17.09.2020
comment
Моя вторая цель состояла в том, чтобы иметь имя вместо .on для орудия события. Это возможно? Я видел, как объект функции реализует не те, которые являются событиями - person Gary; 17.09.2020
comment
Я имею в виду подобъект функции {funcname:function} - person Gary; 17.09.2020