试试 rxjs6。以下为 typescript 代码,可抹掉类型相关代码换成 js
import { Subject } from 'rxjs';
export interface FifoItemType {
ip: string
}
const fifo$ = new Subject<FifoItemType>();
const consumerSub = fifo$.subscribe(consumer)
fifo$.next({ ip: '192.168.1.1' })
fifo$.next({ ip: '192.168.1.2' })
function consumer(data: FifoItemType){
console.log(data.ip)
}
可以 export fifo$ 这样,其他地方都可以调用 .next() 方法生产数据.
上面的 consumerSub 表示 消费者订阅(consumer subscription),可执行 consumerSub.unsubscribe() 来取消订阅。
ps: rxjs 是(异步/同步)流控制的利器。用熟了对于开发效率提升很多(当然调试堆栈不那么友好……)
混合同步及异步消费且耦合的升级版本(需考虑生产速度高于消费速度的背压情况):
import { defer, of, Observable, Subject } from 'rxjs'
import { concatMap, map, tap } from 'rxjs/operators'
export interface FifoItemType {
ip: string
}
const fifo$ = new Subject<FifoItemType>().pipe(
concatMap(consumerAsync),
concatMap(consumerSync),
tap(consumer),
tap(data => consumer(data)),
)
const consumerSub = fifo$.subscribe()
fifo$.next({ ip: '192.168.1.1' })
fifo$.next({ ip: '192.168.1.2' })
function consumerAsync(data: FifoItemType): Observable<FifoItemType> {
const ret$ = defer(() => fetch('saveip/' + data.ip)).pipe(
map(() => data),
)
return ret$
}
function consumerSync(data: FifoItemType): Observable<FifoItemType> {
console.log(data.ip)
return of(data)
}
let outerIp = ''
function consumer(data: FifoItemType): void {
outerIp = data.ip
}