Рубрики
Без рубрики

Возврат, обратные вызовы и весь зоопарк

Обзор взаимосвязей связи. Теги с архитектурой, обратным вызовом, обещанием, JavaScript.

В настоящее время я соотручающую стандартизированную связь между двумя объектами A и Преступность . Чтобы выпустить мой разум от всех мыслей о том, как, почему и балансирующие выгоды и недостатки разных методов, которые я хотел бы поделиться с вами. И, возможно, ваш 2 ¢ поможет мне оптимизировать нашу стратегию. Я хотел бы добавить, что мой контекст – это JavaScript на основе браузера, но некоторые идеи могут быть обобщены.

➡ призвание

Если А хочет позвонить B Я нахожу следующие способы:

  1. Вызов предопределенной функции/метода в объеме А : [B.] act (paral)
  2. Использование общего транспорта связи:
    1. по сообщениям: Transport.PostMessage ({действие: ACT, параметр: param}) Используется в межкоммуникационном и основном потоке/для рабочей нивной связи, но также (Miss) Используется в одном контексте документов (см. Приложение A)
    2. По событию: Transport.DispatchEvent (новый актевамент (Paral)) .

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

⬅ Ответить

Есть больше способов B реагировать и представить состояние успеха или возвратные данные от действия.

  1. напрямую вернуть результат в случае ➡1: Функция ACT (Paral) {...; Вернуть успех}
  2. Alike ➡1: вызовите заранее определенную функцию/метод в объеме B : [A.] Доне (успех)
  3. Alike ➡2: используйте общий транспорт E.g. Transport.DispatchEvent (New DoneActingEvent (успех)
  4. Используйте обратный вызов, содержащийся в параметр : param.callwhendone (успех)
  5. вернуть обещание, выполненное или отклоненное в зависимости от успеха Вернуть новое обещание (функция (F, R) {(успех? F: R) (ExcessData)})

Первый является стандартным способом для всех нешинхронных контекстов, и снова во-вторых может быть необходимо в некоторых случаях. Асинхронный развязка достигается по обратным вызовам, соответственно. Обещания, в то время как обещания кажутся новыми «правильными» способами сделать это.

вывод?

Каковы ваши мысли, когда следует использовать один из них? Является ли взаимозаменяемость в Приложении B, ведущая к одному способу для объекта А И другой для Преступность ? Как насчет иерархии между обоими организациями, вы бывали ваши рекомендации в зависимости от погоды А или B важнее?

A: Интер-оконная связь с использованием PostMessage

class B {
  constructor (targetWindow) {
    targetWindow.addEventListener('message', message => console.log(`B is reading: '${message.data}'`))
  }
}

class A {
  constructor (targetWindowOfB) {
    this.targetOfB = targetWindowOfB
  }
  letBAct (message) {
    this.targetOfB.postMessage(message, '*')
  }
}

let entityA = new A(window)
let entityB = new B(window)
entityA.letBAct('Hy, here is A, are you listening?')

B читает: «Hy, вот есть, вы слушаете?»

B: Преобразование

Наконец, тривиальный, Большинство Методы взаимозаменяемы (1 оставлено как цель). Здесь взаимозаменяемы n м определяется как ответный объект, использующий метод n и принимающее сущность с использованием метода m .

1 ➝ 2:

doneActing(act(param))

1 ➝ 3:

transport.dispatchEvent(new doneActingEvent(act(param)))

1 ➝ 4:

param.callWhenDone(act(param))

1 ➝ 5:

var returnPromise = new Promise(function (f, r) {
  let success = act(param)
  (success ? f : r)(success)
  /* or */
  f(act(param))
})

2 ➝ 3:

function doneActing (success) {
  transport.dispatchEvent(new doneActingEvent(success))
}

2 ➝ 4:

function doneActing(success) {
    param.callWhenDone(success)
}

2 ➝ 5:

let returnPromise = new Promise(function (f, r) {
  function doneActing(success) {
    (success ? f : r)(success)
  }
})

3 ➝ 2:

transport.addEventListener('doneActingEvent', event => doneActing(event.data))

3 ➝ 4:

transport.addEventListener('doneActingEvent', event => param.callWhenDone(event.data))

3 ➝ 5:

let returnPromise = new Promise(function (f, r) {
  transport.addEventListener('doneActingEvent', event => (event.data ? f : r)(event.data))
})

4 ➝ 2:

param.callWhenDone = doneActing

4 ➝ 3:

param.callWhenDone = success => transport.dispatchEvent(new doneActingEvent(success))

4 ➝ 5:

let returnPromise = new Promise(function (f, r) {
  param.callWhenDone = success => (success ? f : r)(success)
})

5 ➝ 2:

promiseResponse.finally(doneActing)

5 ➝ 3:

promiseResponse.finally(param.callWhenDone)

5 ➝ 4:

promiseResponse.finally(success => transport.dispatchEvent(new doneActingEvent(success))

Оригинал: “https://dev.to/hoffmann/returns-callbacks-and-the-whole-zoo-1hbp”