Add AwaitStore
This commit is contained in:
parent
edd37246fb
commit
0781323acb
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@hibas123/utils",
|
"name": "@hibas123/utils",
|
||||||
"version": "2.1.1",
|
"version": "2.2.0",
|
||||||
"description": "Different Utilities, that are not worth own packages",
|
"description": "Different Utilities, that are not worth own packages",
|
||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
"types": "lib/index.d.ts",
|
"types": "lib/index.d.ts",
|
||||||
|
49
readme.md
49
readme.md
@ -35,8 +35,8 @@ Usage:
|
|||||||
|
|
||||||
const server = new Observable(); // Get new Observable Server
|
const server = new Observable(); // Get new Observable Server
|
||||||
|
|
||||||
// Server can only send, not subscribe to messages
|
// Server can send and subscribe to messages
|
||||||
// Receiving is only possible via the public API
|
// The publicAPI will only make the receiving parts available
|
||||||
const public = server.getPublicApi();
|
const public = server.getPublicApi();
|
||||||
|
|
||||||
const func = (data)=>{
|
const func = (data)=>{
|
||||||
@ -44,10 +44,15 @@ Usage:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// func will be callen when a message is available
|
// func will be callen when a message is available
|
||||||
public.subscribe(func);
|
let unsubscribe = public.subscribe(func);
|
||||||
|
|
||||||
server.send("Hello World");
|
server.send("Hello World");
|
||||||
|
|
||||||
|
// Unsubscribe using the returned function from subscribe
|
||||||
|
unsubscribe();
|
||||||
|
|
||||||
|
// OR
|
||||||
|
|
||||||
// This will unsubscribe the function. Please note, that it can
|
// This will unsubscribe the function. Please note, that it can
|
||||||
// only unsubscribe the exact function, that is used in subscribe
|
// only unsubscribe the exact function, that is used in subscribe
|
||||||
public.unsubscribe(func);
|
public.unsubscribe(func);
|
||||||
@ -56,6 +61,44 @@ Usage:
|
|||||||
server.send("Hello World2");
|
server.send("Hello World2");
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## AwaitStore
|
||||||
|
|
||||||
|
This component can be used to await a specific value or to act as an variable with events.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
``` typescript
|
||||||
|
import { AwaitStore } from "@hibas123/util";
|
||||||
|
|
||||||
|
const server = new AwaitStore<number>(0); // Set initial value
|
||||||
|
|
||||||
|
// Server can send and subscribe to messages
|
||||||
|
// Only receiving is possible using the public API
|
||||||
|
const public = server.getPublicApi();
|
||||||
|
|
||||||
|
const func = (data)=>{
|
||||||
|
console.log(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// awaitValue will also return a .ignore() function, that can be used to abort the promise completely
|
||||||
|
public.awaitValue(5).then(()=>console.log("Got 5"));
|
||||||
|
|
||||||
|
// func will be callen when a message is available and once with the current value
|
||||||
|
// This will call func with the current value (0) and on every change after.
|
||||||
|
public.subscribe(func);
|
||||||
|
|
||||||
|
// This send will trigger the subscribtion func and also release the awaitValue causing "Got 5"
|
||||||
|
// to appear in the console
|
||||||
|
server.send(5);
|
||||||
|
|
||||||
|
// This will unsubscribe the function. Please note, that it can
|
||||||
|
// only unsubscribe the exact function, that is used in subscribe
|
||||||
|
public.unsubscribe(func);
|
||||||
|
|
||||||
|
// This now won't call func anymore
|
||||||
|
server.send(8);
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT
|
MIT
|
||||||
|
78
src/awaiter.ts
Normal file
78
src/awaiter.ts
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
import Observable, { ObserverCallback } from "./observable";
|
||||||
|
|
||||||
|
export default class AwaitStore<T = any> {
|
||||||
|
private observable = new Observable<T>();
|
||||||
|
constructor(private _value: T) {
|
||||||
|
this.subscribe = this.subscribe.bind(this);
|
||||||
|
this.unsubscribe = this.unsubscribe.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
get value() {
|
||||||
|
return this._value;
|
||||||
|
}
|
||||||
|
|
||||||
|
send(value: T) {
|
||||||
|
this._value = value;
|
||||||
|
this.observable.send(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
subscribe(handler: ObserverCallback<T>) {
|
||||||
|
handler(this._value);
|
||||||
|
this.observable.subscribe(handler);
|
||||||
|
return () => this.unsubscribe(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsubscribe(handler: ObserverCallback<T>) {
|
||||||
|
this.observable.unsubscribe(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
awaitValue(val: T): PromiseLike<void> & { catch: (cb: (err: any) => PromiseLike<void>) => PromiseLike<void>, ignore: () => void } {
|
||||||
|
|
||||||
|
let ignore: () => void;
|
||||||
|
|
||||||
|
let prms = new Promise<void>(yes => {
|
||||||
|
const cb = () => {
|
||||||
|
if (this._value === val) {
|
||||||
|
yes();
|
||||||
|
this.observable.unsubscribe(cb);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
ignore = () => {
|
||||||
|
this.observable.unsubscribe(cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cb()) {
|
||||||
|
this.observable.subscribe(cb);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
then: prms.then.bind(prms),
|
||||||
|
catch: prms.catch.bind(prms),
|
||||||
|
ignore: () => ignore()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates Public API with subscribe and unsubscribe
|
||||||
|
*
|
||||||
|
* @returns {object}
|
||||||
|
*/
|
||||||
|
getPublicApi() {
|
||||||
|
if (this.observable.closed)
|
||||||
|
throw new Error("Observable is closed!");
|
||||||
|
return {
|
||||||
|
subscribe: (callback: ObserverCallback<T>) => this.subscribe(callback),
|
||||||
|
unsubscribe: (callback: ObserverCallback<T>) => this.unsubscribe(callback),
|
||||||
|
awaitValue: (value: T) => this.awaitValue(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this.observable.close();
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
import Lock, { Release } from "./lock";
|
import Lock, { Release } from "./lock";
|
||||||
import Observable, { ObserverCallback, ObserverCallbackCollect, ObservableInterface } from "./observable";
|
import Observable, { ObserverCallback, ObserverCallbackCollect, ObservableInterface } from "./observable";
|
||||||
|
import AwaitStore from "./awaiter";
|
||||||
|
|
||||||
export {
|
export {
|
||||||
Lock,
|
Lock,
|
||||||
@ -7,5 +8,6 @@ export {
|
|||||||
Observable,
|
Observable,
|
||||||
ObserverCallback,
|
ObserverCallback,
|
||||||
ObserverCallbackCollect,
|
ObserverCallbackCollect,
|
||||||
ObservableInterface
|
ObservableInterface,
|
||||||
|
AwaitStore
|
||||||
}
|
}
|
@ -43,6 +43,8 @@ export default class Observable<T = any> {
|
|||||||
let oldcb = this.subscriber.find(e => e === callback);
|
let oldcb = this.subscriber.find(e => e === callback);
|
||||||
if (!oldcb)
|
if (!oldcb)
|
||||||
this.subscriber.push(callback)
|
this.subscriber.push(callback)
|
||||||
|
|
||||||
|
return () => this.unsubscribe(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsubscribe(callback: ObserverCallback<T> | ObserverCallbackCollect<T>) {
|
unsubscribe(callback: ObserverCallback<T> | ObserverCallbackCollect<T>) {
|
||||||
|
Loading…
Reference in New Issue
Block a user