operations-js

0.1.9 • Public • Published

operations-js

Inspried by Operation and OperationQueue classes from the iOS Framework.

Classes

  • Operation
  • BlockOperation
  • OperationQueue
  • GroupOperation

Operation

const operation = new BlockOperation(6, async () => {
    return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve();
            }, 1000);
        })
});

operation.start()

OperationQueue

const operationQueue = new OperationQueue();

const operation1 = new BlockOperation(1, async () => {
    [...]
});

const operation2 = new BlockOperation(2, async () => {
    [...]
});

operationQueue.addOperations([operation1, operation2]);

Utilizing OperationQueue's maximum concurrent operations

operationQueue.maximumConcurentOperations = 2;

Console:

// operation1 started
// operation2 started
// operation1 done
// operation2 done

Add dependencies

operation1.dependencies = [operation2];
operation1.start()

Console:

// operation2 started
// operation2 done
// operation1 started
// operation1 done

Extend the Operation class for complex tasks

class ValidateTokenOperation extends Operation {
    
    /**
     * Method to implement to run custom task
     * @override
     */
    run() {
        [...]
    }
    
}

Create a list of complex operations that represents your application

const validateToken = new ValidateTokenOperation();
const getUsersApi = new GetUsersApi();

getUsersApi.dependencies = [validateToken];
getUsersApi.completionCallback = operation => {
    // operation.result;
};
getUsersApi.start()
    .then(result => { ... })
    .catch(e => { ... });

Or set the dependency directly in the subclass:

class GetUsersApi extends Operation {
    constructor() {
        this.dependencies = [new ValidateTokenOperation()];
    }
}

Inserting operations in a queue to control flow

const blockOperation6 = new BlockOperation(6, async () => {
    const response = await axios.get('https://samples.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=b6907d289e10d714a6e88b30761fae22');
    const data = response.data;
    return data;
});

const operation = new DownloadDataOperation(1);
const operation2 = new DownloadDataOperation(2);
const operation3 = new DownloadDataOperation(3);
const operation4 = new TimeOutOperation(4, 2000);
const operation5 = new TimeOutOperation(5, 1000);
const operation7 = new TimeOutOperation(7, 8000);
const operation8 = new TimeOutOperation(8, 1500);

operation.dependencies = [operation2, operation7];
operation2.dependencies = [operation4, operation8];
operation3.dependencies = [operation, operation5, operation2];
operation4.dependencies = [operation5, blockOperation6];
operation5.dependencies = [blockOperation6];
operation8.dependencies = [operation7];

const operationQueue = new OperationQueue();
operationQueue.maximumConcurentOperations = 10;

operationQueue.completionCallback = () => {
    console.log('queue done');
};

operationQueue.addOperations([operation3])
    .then(result => {
        console.log(result)
    })
    .catch(e => {
        console.log(e)
    });

GroupOperation:

Group multiple operations and return the result of each operation when they are all resolved.

const groupOperation = new GroupOperation();

groupOperation.addOperation(new GetUsersApi());
groupOperation.addOperation(new GetPostsApi());

const [users, posts] = await groupOperation.start();

Readme

Keywords

none

Package Sidebar

Install

npm i operations-js

Weekly Downloads

11

Version

0.1.9

License

ISC

Unpacked Size

35.8 kB

Total Files

16

Last publish

Collaborators

  • ohdannyboy