В настоящее время я соотручающую стандартизированную связь между двумя объектами A и Преступность . Чтобы выпустить мой разум от всех мыслей о том, как, почему и балансирующие выгоды и недостатки разных методов, которые я хотел бы поделиться с вами. И, возможно, ваш 2 ¢ поможет мне оптимизировать нашу стратегию. Я хотел бы добавить, что мой контекст – это JavaScript на основе браузера, но некоторые идеи могут быть обобщены.
➡ призвание
Если А хочет позвонить B Я нахожу следующие способы:
- Вызов предопределенной функции/метода в объеме
А:[B.] act (paral) - Использование общего транспорта связи:
- по сообщениям:
Transport.PostMessage ({действие: ACT, параметр: param})Используется в межкоммуникационном и основном потоке/для рабочей нивной связи, но также (Miss) Используется в одном контексте документов (см. Приложение A) - По событию:
Transport.DispatchEvent (новый актевамент (Paral)).
- по сообщениям:
Вторая точка может показаться переработанной, но весьма полезна для развязки и даже необходимой, если оба объекта не в одном контексте. Одним из преимуществ второго пути в том, что А просто продолжат работать, даже если B (временно) недоступен. Но с другой стороны B Нужно активно слушать указанные события (сообщение получено как любое другое событие).
⬅ Ответить
Есть больше способов B реагировать и представить состояние успеха или возвратные данные от действия.
- напрямую вернуть результат в случае ➡1:
Функция ACT (Paral) {...; Вернуть успех} - Alike ➡1: вызовите заранее определенную функцию/метод в объеме
B:[A.] Доне (успех) - Alike ➡2: используйте общий транспорт E.g.
Transport.DispatchEvent (New DoneActingEvent (успех) - Используйте обратный вызов, содержащийся в
параметр:param.callwhendone (успех) - вернуть обещание, выполненное или отклоненное в зависимости от успеха
Вернуть новое обещание (функция (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”