@bugtamer/async-status
v1.0.3
Published
Asynchronous process status helper.
Downloads
6
Maintainers
Readme
AsyncStatus JS
Manages the status of an async process.
- Built-in TypeScript declarations.
- Built-in Javascript / TypeScript map declarations.
- Comprehensive unit testing.
- Available at npmjs.com
- Source Code
Table Of Content
Installation
As project dependency
npm i @bugtamer/async-status
As script dependency
const bugtamer = require("@bugtamer/async-status")
const dataAsyncStatus = new bugtamer.AsyncStatus();
or
const bugtamer = require("@bugtamer/async-status/lib/async-status")
const dataAsyncStatus = new bugtamer.AsyncStatus();
import { AsyncStatus } from '@bugtamer/async-status/lib/async-status';
const dataAsyncStatus = new AsyncStatus();
Basic usage snippets
async / await
dataAsyncStatus.start();
try {
data = await fetchData();
dataAsyncStatus.end();
} catch (error) {
dataAsyncStatus.abort();
}
Observable
dataAsyncStatus.start();
const subscription = fetchData().subscribe(
response => {
data = response;
dataAsyncStatus.end();
},
error => {
dataAsyncStatus.abort();
}
);
Status management / Class interface
Use
| Current State | Method called / Sentence | Outcome |
| ------------- | ------------------------ | -------------- |
| | new AsyncStatus()
| idle state |
| idle | start()
| ongoing state |
| ongoing | end()
| idle state |
| ongoing | abort()
| idle state |
| ongoing | start()
| Throw an error |
| idle | end()
| Throw an error |
| idle | abort()
| Throw an error |
Do not try to manage these errors, just fix your code. They point out that some method should never have called.
Check attempt stats
| Sentence | Description |
|---------------------------------------|------------------------------------------|
| dataAsyncStatus.attempts
| returns the number of calls to start()
|
| dataAsyncStatus.successfulAttempts
| returns the number of calls to end()
|
| dataAsyncStatus.failedAttempts
| returns the number of calls to abort()
|
| dataAsyncStatus.resetAttemptStats()
| all previous counters are set to 0 |
Check current state
In this section we understand by call a call to any of the following methods: start()
, end()
or abort()
.
Idle State
There is no process activity.
| dataAsyncStatus.isIdle
| Returns |
|-----------------------------------------------------------------------------|---------|
| When start()
was never executed or the last call was end()
or abort()
| true
|
| In any other case | false
|
Ongoing state
There is a process in progress.
| dataAsyncStatus.isOngoing
| Returns |
|---------------------------------------------------------------------------------------------------|---------|
| When the last call was start()
and therefore neither end()
nor abort()
have been called yet | true
|
| In any other case | false
|
Check last outcome state
In this section we understand by call a call to any of the following methods: start()
, end()
or abort()
.
A successful outcome
| dataAsyncStatus.wasSuccessful
| Returns |
|-----------------------------------------|---------|
| When end()
was the last method called | true
|
| In any other case | false
|
A failed outcome
| dataAsyncStatus.wasFailed
| Returns |
|-------------------------------------------|---------|
| When abort()
was the last method called | true
|
| In any other case | false
|
Measure the time
In milliseconds (ms):
| dataAsyncStatus.elapsedTime
| Returns |
|-------------------------------------------------------------------------------|------------------------------------------------------------------|
| when start()
was never called | AsyncStatus.UNDEFINED_TIME
(-1
) |
| when start()
was called but end()
or abort()
has not yet been called | Time elapsed since the call to start()
to current time |
| when start()
was called and eventually end()
or abort()
was also called | Elapsed time from call to start()
to end()
or abort()
call |
Final notes
Using a single instance of
AsyncStatus
to control multiple independent asynchronous processes that overlap in time could lead to erratic behavior in your program.start()
throws an error when is called more thanNumber.MAX_SAFE_INTEGER
times (although is nearly unreachable).
Examples
- Angular demo example
- Check out the following example at RunKit:
// const bugtamer = require("@bugtamer/async-status/lib/async-status")
const bugtamer = require("@bugtamer/async-status")
function showStats(asyncStatus, message) {
console.log(message)
console.log(` - Attempts: ${asyncStatus.attempts}`)
console.log(` - successful: ${asyncStatus.successfulAttempts}`)
console.log(` - failed: ${asyncStatus.failedAttempts}`)
console.log(` - State:`)
console.log(` - idle: ${asyncStatus.isIdle}`)
console.log(` - ongoing: ${asyncStatus.isOngoing}`)
console.log(` - Outcome:`)
console.log(` - successful: ${asyncStatus.wasSuccessful}`)
console.log(` - failed: ${asyncStatus.wasFailed}`)
console.log(` - Time elapsed: ${asyncStatus.elapsedTime} ms`)
}
// Let's show where the Internation Space Station currently is.
console.log("Let's see where the ISS is with Node " + process.version);
// We can use any package from NPM since they are all built in.
var getJSON = require("async-get-json");
const status = new bugtamer.AsyncStatus();
showStats(status, 'new AsyncStatus()')
status.start()
showStats(status, 'start()')
const url = "http://api.open-notify.org/iss-now.json"; // change it to make it fail
try {
// And we can use ES7 async/await to pull the ISS's position from the open API.
var result = await getJSON(url);
status.end()
showStats(status, 'end()')
} catch (error) {
status.abort()
showStats(status, 'abort()')
}
if (!!result) {
// RunKit will automatically display the last statement and try to find its best representation:
result.iss_position;
}
Example output
Let's see where the ISS is with Node v14.20.1
new AsyncStatus()
- Attempts: 0
- successful: 0
- failed: 0
- State:
- idle: true
- ongoing: false
- Outcome:
- successful: false
- failed: false
- Time elapsed: -1 ms
start()
- Attempts: 1
- successful: 0
- failed: 0
- State:
- idle: false
- ongoing: true
- Outcome:
- successful: false
- failed: false
- Time elapsed: 1 ms
end()
- Attempts: 1
- successful: 1
- failed: 0
- State:
- idle: true
- ongoing: false
- Outcome:
- successful: true
- failed: false
- Time elapsed: 75 ms