0.1.1 • Published 7 years ago

seriallency v0.1.1

Weekly downloads
21
License
Apache-2.0
Repository
github
Last release
7 years ago

Seriallency

Serialize a bunch of Promises according to a specific field

Build Status Build Status Coverage

Demo example

View demo in JSFiddle.

With this module you can serialize multiple Promises by a specific key, so you can be sure that only a single promise for that key. Seriallency uses an internal dictionary to store promises if it already exists one previous Promise associated to the same key. For example:

You must execute 1 promise for User1, 2 promises for User2 and 3 promises for User3. All promises must be executed as fast as possible, BUT due to requirements, only ONE Promise for each user can be executing at once. With Seriallency you can achieve this easily, and get this execution order: seriallency_schema

Installation

npm install seriallency --save

Usage

Example 1: basic usage

import { Seriallency } from 'seriallency';

let seriallency = new Seriallency();

// USER1
seriallency.push({ serializeBy: 'user1', fn: hardWorkFn, params: ['user1', 1]});
// execute hardWorkFn('user1', 1) immediately

// USER2
seriallency.push({ serializeBy: 'user2', fn: hardWorkFn, params: ['user2', 1]});
// execute hardWorkFn('user2', 1) immediately
seriallency.push({ serializeBy: 'user2', fn: hardWorkFn, params: ['user2', 2]});
// queue hardWorkFn('user2', 2) to be executed when hardWorkFn('user2', 1) is resolved or rejected.

// USER3
seriallency.push({ serializeBy: 'user3', fn: hardWorkFn, params: ['user3', 1]});
// execute hardWorkFn('user3', 1) immediately
seriallency.push({ serializeBy: 'user3', fn: hardWorkFn, params: ['user3', 2]});
// queue hardWorkFn('user3', 2) to be executed when hardWorkFn('user3', 1) is resolved or rejected.
seriallency.push({ serializeBy: 'user3', fn: hardWorkFn, params: ['user3', 3]});
// queue hardWorkFn('user3', 3) to be executed when hardWorkFn('user3', 2) is resolved or rejected.

function hardWorkFn(userName: string, numParam: number): Promise<any>{
    console.log(`Executing hardWorkFn. userName:${userName}, numParam:${numParam}`);
    return new Promise(resolve => {
        // ... do some async process
        setImmediate(resolve);
    });
}

// Output is:
// Executing hardWorkFn. userName: user1, numParam: 1
// Executing hardWorkFn. userName: user2, numParam: 1
// Executing hardWorkFn. userName: user3, numParam: 1
// Executing hardWorkFn. userName: user2, numParam: 2
// Executing hardWorkFn. userName: user3, numParam: 2
// Executing hardWorkFn. userName: user3, numParam: 3