Publish
emit(topic, data[, async = true])
Description
emit()方法用来发布订阅主题信息。
subscribers.js 默认是采用异步方式发布的。以确保在消费者处理主题时,主题的发起者不会被阻止。 当然 emit() 方法也支持同步主题发布。
- Category:
- Core
Parameters
topic
- Type:
- String
(必须)主题名称。
data
- Type:
- Object
(必须)消息传递的数据对象。
async
- Type:
- Boolean
- Default:
- true
(可选) 是否异步发布。默认值:true。
- 当 async 设置为 true(默认) 时,异步发布;
- 当 async 设置为 false 时,同步发布;
Returns
- Type:
- subscribers。
subscribers 对象,以便实现链式调用。
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = (msg) => {
console.log(msg)
}
subscribers.on('author', handler)
subscribers.on('career', handler)
subscribers.on('years', handler)
// 异步发布
subscribers.emit('author', 'ok') // -> 'ok'
// 同步发布
// 延迟10毫秒:应该看输出 ok 后输出 programmer
subscribers.emit('career', 'programmer', false) // -> 'programmer'
notify(topic, data)
Description
同步发布订阅主题信息。
Parameters
topic
- Type:
- String
(必须)主题名称。
data
- Type:
- Object
(必须)消息传递的数据对象。
Returns
- Type:
- subscribers。
subscribers 对象,以便实现链式调用。
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = (msg) => {
console.log(msg)
}
subscribers.on('author', handler)
subscribers.on('career', handler)
subscribers.on('years', handler)
// 依次输出:'author'、'career'、'years'
subscribers.notify('author', 'ok') // -> 'ok'
subscribers.notify('career', 'programmer') // -> 'programmer'
subscribers.notify('years', 19) // -> 19
Subscribe
on(topic, handler)
Description
on() 方法用来订阅主题,并给出处理器函数。
- Category:
- Core
Parameters
topic
- Type:
- String
(必须)主题名称。
handler
- Type:
- Function
((必须)主题的处理器函数。
Returns
- Type:
- String。
唯一的 token 字符串,例如:'guid-1'。
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = (author) => {
console.log(`Author: ${author}`)
}
subscribers.on('author', handler)
// 支持命名空间形式的主题的订阅
subscribers.on('author.career', handler)
subscribers.on('author.career.years', handler)
subscribers.emit('author', 'Yaohaixiao') // -> `Author: Yaohaixiao`
subscribers.emit('author.career', 'Programmer') // -> `Author: Programmer`
subscribers.emit('author.career.years', 23) // -> `Author: 23`
once(topic, handler)
Description
once() 方法用来订阅主题,并给出处理器函数,仅执行一次。
Parameters
topic
- Type:
- String
(必须)主题名称。
handler
- Type:
- Function
((必须)主题的处理器函数。
Returns
- Type:
- String。
唯一的 token 字符串,例如:'guid-1'。
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = () => {
console.log('author is Robert')
}
subscribers.once('author', handler)
// 发布消息
subscribers.emit('author')
// 再次发布 handler 将不再执行
subscribers.emit('author')
all(handler)
Description
all() 方法用于订阅所有主题消息发布,任何消息发布都会执行 handler() 处理器。
Parameters
handler
- Type:
- Function
((必须)处理器函数。
Returns
- Type:
- String。
唯一的 token 字符串,例如:'guid-1'。
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = (msg) => {
console.log(`handler:${msg}`)
}
const callback = (msg) => {
console.log(`handler:${msg}`)
}
subscribers.on('author', handler)
subscribers.on('career', handler)
// 监听所有消息
subscribers.all(callback)
// 发布消息
subscribers.emit('author', 'Robert')
// -> 'handler:Robert'
// 每次都会触发 all() 方法的订阅处理方法
// -> 'callback:Robert'
subscribers.emit('career', 'Programmer')
// -> 'handler:Programmer'
// -> 'callback:Programmer'
Unsubscribe
off(topic[, token])
Description
off() 用来取消订阅主题。
- Category:
- Core
Parameters
topic
- Type:
- String
(必须)主题名称。
token
- Type:
- Function | String
(可选)订阅主题的处理器函数或者唯一 Id 值。
- 为传递 token 参数:取消指定 topic 的订阅;
- 传递 token 参数:仅删除 topic 订阅信息中与 token 对应的事件处理器
Returns
- Type:
- subscribers。
subscribers 对象,以便实现链式调用。
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = (msg) => {
console.log('handler:', msg)
}
const callback = (msg) => {
console.log('callback:', msg)
}
subscribers.on('author', handler)
const token = subscribers.on('career', handler)
const guid = subscribers.on('career', handler)
// 取消订阅 author 主题
subscribers.off('author', handler)
// 删除订阅 career 主题下的 handler 处理器
subscribers.off('career', token)
// 删除订阅 career 主题下的 callback 处理器
subscribers.off('career', guid)
// 订阅 career 主题下2个处理器都删除后
// 会取消整个 author 主题订阅,因此再发布 author 主题消息
// 不会有任何反应
subscribers.emit('career', 'web developer')
remove(topic)
Description
remove() 删除特定(单个或多个) topic 主题的订阅者信息。
Parameters
topic
- Type:
- String | Array
(必须)主题名称。
- String 类型:删除单个 topic 主题的订阅者信息;
- Array 类型:删除多个 topic 主题的订阅者信息;
Returns
- Type:
- subscribers。
subscribers 对象,以便实现链式调用。
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = (msg) => {
console.log('handler:', msg)
}
const callback = (msg) => {
console.log('callback:', msg)
}
subscribers.on('author', handler)
subscribers.on('publish', callback)
// 删除 author 主题相关的所有信息
subscribers.remove('author')
// 同时删除 author 和 publish 主题相关的所有信息
subscribers.remove(['author', 'publish'])
clear()
Description
clear() 方法用于清理所有订阅者(主题和处理器的)信息。
Returns
- Type:
- subscribers。
subscribers 对象,以便实现链式调用。
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = (msg) => {
console.log('handler:', msg)
}
subscribers.on('author', handler)
subscribers.on('author.career', handler)
subscribers.on('author.career.years', handler)
// 清理所有订阅者(主题和处理器的)信息
subscribers.clear()
subscribers.has() // -> false
Utils
get([topic])
Description
get() 方法用来获取全部或者包含 topic 主题或者订阅 token 的订阅者信息。
Parameters
topic
- Type:
- String
(可选)主题名称。
- 不传递 topic 参数,返回全部订阅者信息;
- 传递 topic 参数
- 如果是 topic 主题:返回包含 topic 主题的订阅者信息;
- 如果是订阅 token:返回包含此 token 信息的 topic 主题的订阅者信息;
Returns
- Type:
- Array | Object。
返回全部或者包含 topic 主题或者订阅 token 的订阅者信息。
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = (msg) => {
console.log('handler:', msg)
}
subscribers.on('author', handler)
subscribers.on('career', handler)
subscribers.on('years', handler)
const token = subscribers.on('years', handler)
// 获取 author 主题订阅者信息
subscribers.get('author')
// -> 返回 author 主题的订阅信息
// [
// topic: 'author',
// callback: handler,
// token: 'guid-1'
// ]
subscribers.get(token)
// -> 返回 career 主题的订阅信息
// [
// topic: 'career',
// callback: handler,
// token: 'guid-2'
// ]
// 获取所有订阅者信息
subscribers.get()
// -> 返回所有主题的订阅信息
// {
// 'author': [
// topic: 'author',
// callback: handler,
// token: 'guid-1'
// ]
// 'career': [
// topic: 'career',
// callback: handler,
// token: 'guid-2'
// ]
// 'years': [
// topic: 'years',
// callback: handler,
// token: 'guid-3'
// ]
// }
has([topic, isDirect = true])
Description
has() 方法判断是否存在指定或者包含 topic 的订阅者信息。
Parameters
topic
- Type:
- String
(可选)主题名称。
- 传递 topic 参数:判断指定 topic 或者消息主题的命名空间中包含 topic 的订阅信息;
- 不传递 topic 参数:判断是否包含任何订阅信息;
isDirect
- Type:
- Boolean
(可选)是否为指定 topic,默认值: true。
- true:匹配完全相同的主题或者主题的命名空间中包含 topic 的订阅;
- false:只匹配与指定 topic 主题完全相同的主题;
Returns
- Type:
- Boolean。
- true:有相关的订阅信息;
- false:无相关的订阅信息;
import subscribers from '@yaohaixiao/subscribers.js/subscribers'
const handler = (msg) => {
console.log('handler:', msg)
}
subscribers.on('author', handler)
subscribers.on('author.career.years', handler)
subscribers.has('author.career')
// => true - 因为包含 author 主题
subscribers.has('author.career.year')
// => true 因为有完全匹配的主题
subscribers.has('author.career', false)
// => false 因为没有完全匹配的主题
subscribers.has()
// => true