2.0.1 • Published 7 years ago

promise-cancel v2.0.1

Weekly downloads
110
License
MIT
Repository
github
Last release
7 years ago

promise-cancel

Add ability to cancel/timeout to your Promise! Note that this is not Promise implementation or polyfill! Make sure your JavaScript environment support Promise API first. If not, you can use plenty of polyfills such as isomorphic-fetch or Fetch polyfill.

Update to 2.x

I decided to update 2.x, which is little different usage from 1.x. In 1.x, I added cancel method directly the promise object. This is quite handy some situations, however you can loose this 'cancel' method if you are wrapping another promise inside.

Now 2.x returns a object that contains both promise and cancel method, now you can access cancel function anywhere you do with promises.

Updating isn't hard, so I recommend to use 2.x instead of 1.x. See the example to details.

Usage

Install via npm:

$ npm install --save promise-cancel

And require it.

var promiseCancel = require('promise-cancel');

And wrap your promise object.

var request = new Promise(...);
var handler = promiseCancel(request);

handler.promise
.then(...)
.catch(...);

handler.cancel();	// Cancel promise immediately

When you cancel the promise, catch will get it.

Examples

This module is designed for adding canceling Fetch request. But it's not using Fetch API features inside, so you don't need to worry about that.

Cancel Example

var request = doAsync();
var cancelable = promiseCancel(request);

cancelable.promise
.then(() => console.log('Done!'))
.catch((err) => console.log('Error', err));

setTimeout(cancelable.cancel, 3000);

Timeout Example

var request = doAsync();
var cancelable = promiseCancel(request, { timeout: 3000 });

cancelable.promise
.then(() => console.log('Done!'))
.catch((err) => console.log('Error', err));

How to distinguish between Timeout or User cancellation?

promise-cancel call the onRejected callback when it canceled or timed-out, but parameter of onReject callback is just Error object.

Compare the message to distinguish is terrible idea, so I added a addtional property inside of Error, 'type'. Type can be 'undefined', 'cancel', 'timeout'. Of course, undefined means that there is no type, it's just coming from something else not user cancel or timed out.

.catch((err) => {
	if(err.type === 'timeout') { ... }
	else if(err.type === 'cancel') { ... }
	else {
		...
	}
})

API

Object promiseCancel(Promise p, Object options)

Create new cancelable promise. Possible options are:

  • Number options.timeout: Set timeout.

Returning object contains "promise" object and "cancel" function.

promiseCancel.cancel

promiseCancel.abort

Cancle current working promise. Note that if you are using this module for adding cancel for Fetch, request itself can't be aborted. This is the limitation of current Fetch implementation, unlike XHR has abort method.

Anyway only you can do is stop promise flow going, and give immediately some fetch related tasks.

License

MIT. Free to use.

2.0.1

7 years ago

2.0.0

7 years ago

1.0.12

7 years ago

1.0.11

7 years ago

1.0.1

7 years ago

1.0.0

7 years ago