Methods
# (async) asyncRoot(fct, errorHandler)
Immediately calls an asynchronous function and redirects to an error handler if it throws an exception. The error handler is optional, the default one just outputs the error in the console.
This function is trivial but useful in the context of node.js when you would like to use await in the root scope. It is also used in most examples provided for this library.
Name | Type | Default | Description |
---|---|---|---|
fct |
function | An asynchronous function to call. |
|
errorHandler |
function | null | (Optional) A facultative error handler. This function will receive a single argument: the thrown exception. The default behavior is to output the exception in the console. |
- Source:
import { asyncRoot } from 'modern-async'
// or
const { asyncRoot } = require('modern-async')
asyncRoot(async () => {
// any code using await
}, (e) => {
console.error("An error occured", e)
process.exit(-1)
})
# asyncWrap(fct) → {function}
Wraps a function call that may be synchronous in a function that
is guaranted to be async. This is a stricter version of calling a
function and wrapping its result using Promise.resolve()
as the new function also
handles the case where the original function throws an exception.
Name | Type | Description |
---|---|---|
fct |
function | The function to wrap. |
- Source:
The wrapped function.
- Type
- function
import { asyncWrap } from 'modern-async'
const myFunction = () => {
// any kind of function that may or may not return a promise
}
const asyncFct = asyncWrap(myFunction)
const promise = asyncFct()
console.log(promise instanceof Promise) // prints true
# (async) delay() → {Promise}
A function returning a promise that will be resolved in a later tick of the event loop.
This function simply uses setTimeout()
internally as it's the most portable solution.
A promise that will be resolved on a later tick of the event loop.
- Type
- Promise
import { delay, asyncRoot } from 'modern-async'
asyncRoot(async () => {
console.log('this executes in a tick of the event loop')
await delay()
console.log('this executes in another tick of the event loop')
})
# delayCancellable() → {Array}
A function returning a promise that will be resolved in a later tick of the event loop.
This function returns both a promise and cancel function in order to cancel the wait time if necessary. If cancelled, the promise will be rejected with a CancelledError.
This function simply uses setTimeout()
internally as it's the most portable solution.
- Source:
A tuple of two objects:
- The promise
- The cancel function. It will return a boolean that will be true if the promise was effectively cancelled, false otherwise.
- Type
- Array
import { delayCancellable, asyncRoot, CancelledError } from 'modern-async'
asyncRoot(async () => {
const [promise, cancel] = delayCancellable()
cancel()
try {
await promise
} catch (e) {
console.log(e instanceof CancelledError) // prints true
}
})
# (async) every(iterable, iteratee) → {Promise}
Returns true
if all elements of an iterable pass a truth test and false
otherwise.
The iteratee will be run in parallel. If any truth test returns false
the promise is immediately resolved.
In case of exception in one of the iteratee calls the promise returned by this function will be rejected
with the exception. In the very specific case where a test returns false
and an already started task throws
an exception that exception will be plainly ignored.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
A promise that will be resolved to true
if all values pass the truth test and false
if a least one of them doesn't pass it. That promise will be rejected if one of the truth test throws
an exception.
- Type
- Promise
import { every, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await every(array, async (v) => {
// these calls will be performed in parallel
await sleep(10) // waits 10ms
return v > 0
})
console.log(result) // prints true
// total processing time should be ~ 10ms
})
# (async) everyLimit(iterable, iteratee, concurrency) → {Promise}
Returns true
if all elements of an iterable pass a truth test and false
otherwise.
The iteratee will be run in parallel, up to a concurrency limit. If any truth test returns false
the promise is immediately resolved.
Whenever a test returns false
, all the remaining tasks will be cancelled as long
as they didn't started already. In case of exception in one of the iteratee calls the promise
returned by this function will be rejected with the exception and the remaining pending
tasks will also be cancelled. In the very specific case where a test returns false
and an
already started task throws an exception that exception will be plainly ignored.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
concurrency |
number | The number of times iteratee can be called concurrently. |
- Source:
A promise that will be resolved to true
if all values pass the truth test and false
if a least one of them doesn't pass it. That promise will be rejected if one of the truth test throws
an exception.
- Type
- Promise
import { everyLimit, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await everyLimit(array, async (v) => {
// these calls will be performed in parallel with a maximum of 2
// concurrent calls
await sleep(10) // waits 10ms
return v > 0
}, 2)
console.log(result) // prints true
// total processing time should be ~ 20ms
})
# (async) everySeries(iterable, iteratee) → {Promise}
Returns true
if all elements of an iterable pass a truth test and false
otherwise.
The iteratee will be run sequentially. If any truth test returns false
the promise is
immediately resolved.
In case of exception in one of the iteratee calls the promise returned by this function will be rejected with the exception and the remaining pending tasks will be cancelled.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
- Source:
A promise that will be resolved to true
if all values pass the truth test and false
if a least one of them doesn't pass it. That promise will be rejected if one of the truth test throws
an exception.
- Type
- Promise
import { everySeries, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await everySeries(array, async (v) => {
// these calls will be performed sequentially
await sleep(10) // waits 10ms
return v > 0
})
console.log(result) // prints true
// total processing time should be ~ 30ms
})
# (async) filter(iterable, iteratee) → {Promise}
Returns a new array of all the values in iterable which pass an asynchronous truth test.
The calls to iteratee
will perform in parallel, but the results array will be in the same order
than the original.
If any of the calls to iteratee throws an exception the returned promised will be rejected.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of
|
- Source:
A promise that will be resolved with an array containing all the values that passed
the truth test. This promise will be rejected if any of the iteratee
calls throws an exception.
- Type
- Promise
import { filter, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await filter(array, async (v) => {
// these calls will be performed in parallel
await sleep(10) // waits 10ms
return v % 2 === 1
})
console.log(result) // prints [1, 3]
// total processing time should be ~ 10ms
})
# (async) filterLimit(iterable, iteratee, concurrency) → {Promise}
Returns a new array of all the values in iterable which pass an asynchronous truth test.
The calls to iteratee
will perform in parallel, up to the concurrency limit, but the results array will be
in the same order than the original.
If any of the calls to iteratee throws an exception the returned promised will be rejected and the remaining pending tasks will be cancelled.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of
|
concurrency |
number | The number of times iteratee can be called concurrently. |
- Source:
A promise that will be resolved with an array containing all the values that passed
the truth test. This promise will be rejected if any of the iteratee
calls throws an exception.
- Type
- Promise
import { filterLimit, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await filterLimit(array, async (v) => {
// these calls will be performed in parallel with a maximum of 2
// concurrent calls
await sleep(10) // waits 10ms
return v % 2 === 1
}, 2)
console.log(result) // prints [1, 3]
// total processing time should be ~ 20ms
})
# (async) filterSeries(iterable, iteratee) → {Promise}
Returns a new array of all the values in iterable which pass an asynchronous truth test.
The calls to iteratee
will perform sequentially and the results array will be in the same order
than the original.
If any of the calls to iteratee throws an exception the returned promised will be rejected and the remaining pending tasks will be cancelled.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
- Source:
A promise that will be resolved with an array containing all the values that passed
the truth test. This promise will be rejected if any of the iteratee
calls throws an exception.
- Type
- Promise
import { filterSeries, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await filterSeries(array, async (v) => {
// these calls will be performed sequentially
await sleep(10) // waits 10ms
return v % 2 === 1
})
console.log(result) // prints [1, 3]
// total processing time should be ~ 30ms
})
# (async) find(iterable, iteratee) → {Promise}
Returns the first element of an iterable that passes an asynchronous truth test.
The calls to iteratee
will run in parallel. This implies that the element found by this function may not
be the first element of the iterable able to pass the truth test. It will be the first one in time
for which one of the parallel calls to iteratee
was able to return a positive result. If you need
a sequential alternative use findSeries()
.
In case of exception in one of the iteratee
calls the promise returned by this function will be
rejected with the exception. In the very specific case where a result is found and an
already started task throws an exception that exception will be plainly ignored.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
A promise that will be resolved with the first found value or rejected if one of the
iteratee
calls throws an exception before finding a value. If no value is found it will return undefined
.
- Type
- Promise
import { find, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await find(array, async (v) => {
// these calls will be performed in parallel
await sleep(Math.random() * 10) // waits a random amount of time between 0ms and 10ms
return v % 2 === 1
})
console.log(result) // prints 1 or 3 randomly
})
# (async) findIndex(iterable, iteratee) → {Promise}
Returns the index of the first element of an iterable that passes an asynchronous truth test.
The calls to iteratee
will run in parallel. This implies that the element found by this function may not
be the first element of the iterable able to pass the truth test. It will be the first one in time
for which one of the parallel calls to iteratee
was able to return a positive result. If you need
a sequential alternative use findIndexSeries()
.
In case of exception in one of the iteratee
calls the promise returned by this function will be
rejected with the exception. In the very specific case where a result is found and an
already started task throws an exception that exception will be plainly ignored.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
- Source:
A promise that will be resolved with the index of the first found value or rejected if one of the
iteratee
calls throws an exception before finding a value. If no value is found it will return -1
.
- Type
- Promise
import { findIndex, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await findIndex(array, async (v) => {
// these calls will be performed in parallel
await sleep(Math.random() * 10) // waits a random amount of time between 0ms and 10ms
return v % 2 === 1
})
console.log(result) // prints 0 or 2 randomly
})
# (async) findIndexLimit(iterable, iteratee, concurrency) → {Promise}
Returns the index of the first element of an iterable that passes an asynchronous truth test.
The calls to iteratee
will run in parallel, up to a concurrency limit. This implies that
the element found by this function may not be the first element of the iterable able to pass the
truth test. It will be the first one in time for which one of the parallel calls to iteratee
was able to
return a positive result. If you need a sequential alternative use findIndexSeries()
.
Whenever a result is found, all the remaining tasks will be cancelled as long as they didn't started already. In case of exception in one of the iteratee calls the promise returned by this function will be rejected with the exception and the remaining pending tasks will also be cancelled. In the very specific case where a result is found and an already started task throws an exception that exception will be plainly ignored.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
concurrency |
number | The number of times iteratee can be called concurrently. |
- Source:
A promise that will be resolved with the index of the first found value or rejected if one of the
iteratee
calls throws an exception before finding a value. If no value is found it will return -1
.
- Type
- Promise
import { findIndexLimit, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3, 4, 5]
const result = await findIndexLimit(array, async (v) => {
// these calls will be performed in parallel with a maximum of 3
// concurrent calls
await sleep(Math.random() * 10) // waits a random amount of time between 0ms and 10ms
return v % 2 === 1
}, 3)
console.log(result) // prints 0, 2 or 4 randomly
// 4 is a potential result in this case even with a concurrency of 3 due to how
// randomness works, and all asynchronous operations are inherently random. The only way to ensure an
// order is to use a concurreny of 1 or to use findSeries() which does the same thing.
})
# (async) findIndexSeries(iterable, iteratee) → {Promise}
Returns the index of the first element of an iterable that passes an asynchronous truth test.
The calls to iteratee
will run sequentially. As opposed to findIndex()
and findIndexLimit()
this ensures
that if multiple values may pass the truth test it will be the first one of the iterable that will be
returned.
In case of exception in one of the iteratee
calls the promise returned by this function will be
rejected with the exception and the remaining pending tasks will be cancelled.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
- Source:
A promise that will be resolved with the index of the first found value or rejected if one of the
iteratee
calls throws an exception before finding a value. If no value is found it will return -1
.
- Type
- Promise
import { findIndexSeries, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await findIndexSeries(array, async (v) => {
// these calls will be performed sequentially
await sleep(Math.random() * 10) // waits a random amount of time between 0ms and 10ms
return v % 2 === 1
})
console.log(result) // always prints 0
})
# (async) findLimit(iterable, iteratee, concurrency) → {Promise}
Returns the first element of an iterable that passes an asynchronous truth test.
The calls to iteratee
will run in parallel, up to a concurrency limit. This implies that
the element found by this function may not be the first element of the iterable able to pass the
truth test. It will be the first one for which one of the parallel calls to iteratee
was able to
return a positive result. If you need a sequential alternative use findSeries()
.
Whenever a result is found, all the remaining tasks will be cancelled as long
as they didn't started already. In case of exception in one of the iteratee
calls the promise
returned by this function will be rejected with the exception and the remaining pending
tasks will also be cancelled. In the very specific case where a result is found and an
already started task throws an exception that exception will be plainly ignored.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
concurrency |
number | The number of times iteratee can be called concurrently. |
- Source:
A promise that will be resolved with the first found value or rejected if one of the
iteratee
calls throws an exception before finding a value. If no value is found it will return undefined
.
- Type
- Promise
import { findLimit, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3, 4, 5]
const result = await findLimit(array, async (v) => {
// these calls will be performed in parallel with a maximum of 3
// concurrent calls
await sleep(Math.random() * 10) // waits a random amount of time between 0ms and 10ms
return v % 2 === 1
}, 3)
console.log(result) // prints 1, 3 or 5 randomly
// 5 is a potential result in this case even with a concurrency of 3 due to how
// randomness works, and all asynchronous operations are inherently random. The only way to ensure an
// order is to use a concurreny of 1 or to use findSeries() which does the same thing.
})
# (async) findSeries(iterable, iteratee) → {Promise}
Returns the first element of an iterable that passes an asynchronous truth test.
The calls to iteratee
will run sequentially. As opposed to find()
and findLimit()
this ensures
that if multiple values may pass the truth test it will be the first one of the iterable that will be
returned.
In case of exception in one of the iteratee
calls the promise returned by this function will be
rejected with the exception.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
- Source:
A promise that will be resolved with the first found value or rejected if one of the
iteratee
calls throws an exception before finding a value. If no value is found it will return undefined
.
- Type
- Promise
import { findSeries, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await findSeries(array, async (v) => {
// these calls will be performed sequentially
await sleep(Math.random() * 10) // waits a random amount of time between 0ms and 10ms
return v % 2 === 1
})
console.log(result) // always prints 1
})
# (async) forEach(iterable, iteratee) → {Promise}
Calls a function on each element of iterable.
Multiple calls to iteratee
will be performed in parallel.
If any of the calls to iteratee throws an exception the returned promised will be rejected.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
- Source:
A promise that will be resolved when all the calls to iteratee
have been done.
This promise will be rejected if any call to iteratee
throws an exception.
- Type
- Promise
import { forEach, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
await forEach(array, async (v) => {
// these calls will be performed in parallel
await sleep(Math.random() * 10) // waits a random amount of time between 0ms and 10ms
console.log(v)
})
// prints 1, 2 and 3 in a random order
})
# (async) forEachLimit(iterable, iteratee, concurrency) → {Promise}
Calls a function on each element of iterable.
Multiple calls to iteratee
will be performed in parallel, up to the concurrency limit.
If any of the calls to iteratee throws an exception the returned promised will be rejected and the remaining pending tasks will be cancelled.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
concurrency |
number | The number of times iteratee can be called concurrently. |
- Source:
A promise that will be resolved when all the calls to iteratee
have been done.
This promise will be rejected if any call to iteratee
throws an exception.
- Type
- Promise
import { forEachLimit, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
await forEachLimit(array, async (v) => {
// these calls will be performed in parallel with a maximum of 2
// concurrent calls
await sleep(Math.random() * 10) // waits a random amount of time between 0ms and 10ms
console.log(v)
}, 2)
// prints 1, 2 and 3 in a random order (it will always print 1 or 2 before printing 3 due to
// the concurrency limit and the internal scheduling order)
})
# (async) forEachSeries(iterable, iteratee) → {Promise}
Calls a function on each element of iterable.
Multiple calls to iteratee
will be performed sequentially.
If any of the calls to iteratee throws an exception the returned promised will be rejected and the remaining pending tasks will be cancelled.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
- Source:
A promise that will be resolved when all the calls to iteratee
have been done.
This promise will be rejected if any call to iteratee
throws an exception.
- Type
- Promise
import { forEachSeries, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
await forEachSeries(array, async (v) => {
// these calls will be performed sequentially
await sleep(Math.random() * 10) // waits a random amount of time between 0ms and 10ms
console.log(v)
})
// prints 1, 2 and 3 in that exact order
})
# (async) map(iterable, iteratee) → {Promise}
Produces a new collection of values by mapping each value in iterable
through the iteratee
function.
Multiple calls to iteratee
will be performed in parallel.
If any of the calls to iteratee throws an exception the returned promised will be rejected.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
A promise that will be resolved with an array containing all the mapped value,
or will be rejected if any of the calls to iteratee
throws an exception.
- Type
- Promise
import { map, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await map(array, async (v) => {
// these calls will be performed in parallel
await sleep(10) // waits 10ms
return v * 2
})
console.log(result) // prints [2, 4, 6]
// total processing time should be ~ 10ms
})
# (async) mapLimit(iterable, iteratee, concurrency) → {Promise}
Produces a new collection of values by mapping each value in iterable
through the iteratee
function.
Multiple calls to iteratee
will be performed in parallel, up to the concurrency limit.
If any of the calls to iteratee throws an exception the returned promised will be rejected and the remaining pending tasks will be cancelled.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
concurrency |
number | The number of times |
- Source:
A promise that will be resolved with an array containing all the mapped value,
or will be rejected if any of the calls to iteratee
throws an exception.
- Type
- Promise
import { mapLimit, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await mapLimit(array, async (v) => {
// these calls will be performed in parallel with a maximum of 2
// concurrent calls
await sleep(10) // waits 10ms
return v * 2
}, 2)
console.log(result) // prints [2, 4, 6]
// total processing time should be ~ 20ms
})
# (async) mapSeries(iterable, iteratee) → {Promise}
Produces a new collection of values by mapping each value in iterable
through the iteratee
function.
Multiple calls to iteratee
will be performed sequentially.
If any of the calls to iteratee throws an exception the returned promised will be rejected and the remaining pending tasks will be cancelled.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
- Source:
A promise that will be resolved with an array containing all the mapped value,
or will be rejected if any of the calls to iteratee
throws an exception.
- Type
- Promise
import { mapSeries, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await mapSeries(array, async (v) => {
// these calls will be performed sequentially
await sleep(10) // waits 10ms
return v * 2
}, 2)
console.log(result) // prints [2, 4, 6]
// total processing time should be ~ 30ms
})
# (async) reduce(iterable, reducer, initial) → {Promise}
Performs a reduce operation as defined in the Array.reduce()
method but using an asynchronous
function as reducer. The reducer will be called sequentially.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
reducer |
function | The reducer function. It will be called with four arguments:
|
initial |
* | The initial value that will be used as accumulator in the first call to
|
- Source:
A promise that will be resolved with the result of the reduce operation,
or rejected if any of the calls to reducer
throws an exception.
- Type
- Promise
import { reduce, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await reduce(array, async (v, p) => {
// these calls will be performed sequentially
await sleep(10) // waits 10ms
return v + p
})
console.log(result) // prints 6
// total processing time should be ~ 20ms
})
# (async) reduceRight(iterable, reducer, initial) → {Promise}
Performs a reduce operation as defined in the Array.reduceRight()
method but using an asynchronous
function as reducer. The reducer will be called sequentially.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
reducer |
function | The reducer function. It will be called with four arguments:
|
initial |
* | The initial value that will be used as accumulator in the first call to
reducer. If omitted the first element of |
- Source:
A promise that will be resolved with the result of the reduce operation,
or rejected if any of the calls to reducer
throws an exception.
- Type
- Promise
import { reduceRight, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await reduceRight(array, async (v, p) => {
// these calls will be performed sequentially
await sleep(10) // waits 10ms
return v + p
})
console.log(result) // prints 6
// total processing time should be ~ 20ms
})
# (async) sleep(amount) → {Promise}
Waits a given amount of time.
This function uses setTimeout()
internally and has the same behavior, notably that it could resolve
after the asked time (depending on other tasks running in the event loop) or a few milliseconds before.
Name | Type | Description |
---|---|---|
amount |
number | An amount of time in milliseconds |
A promise that will be resolved after the given amount of time has passed.
- Type
- Promise
import { sleep, asyncRoot } from 'modern-async'
asyncRoot(async () => {
await sleep(100) // will wait 100ms
})
// another example that doesn't block on the sleep call
// it's functionally identical to using setTimout but with a promise syntax
import { sleep } from 'modern-async'
sleep(10).then(() => {
console.log('hello')
})
// will print 'hello' after 10ms
# sleepCancellable(amount) → {Array}
Waits a given amount of time. This function returns both a promise and cancel function in
order to cancel the wait time if necessary. If cancelled, the promise will be rejected
with a CancelledError
.
This function uses setTimeout()
internally and has the same behavior, notably that it could resolve
after the asked time (depending on other tasks running in the event loop) or a few milliseconds before.
Name | Type | Description |
---|---|---|
amount |
number | An amount of time in milliseconds |
- Source:
A tuple of two objects:
promise
: The promisecancel
: The cancel function. It will return a boolean that will betrue
if the promise was effectively cancelled,false
otherwise.
- Type
- Array
import { sleepCancellable, asyncRoot } from 'modern-async'
asyncRoot(async () => {
const [promise, cancel] = sleepCancellable(100) // schedule to resolve the promise after 100ms
cancel()
try {
await promise
} catch (e) {
console.log(e.name) // prints CancelledError
}
})
# (async) sleepPrecise(amount) → {Promise}
Waits a given amount of time.
This function is similar to sleep()
except it ensures that the amount of time measured
using the Date
object is always greater than or equal the asked amount of time.
This function can imply additional delay that can be bad for performances. As such it is
recommended to only use it in unit tests or very specific cases. Most applications should
be adapted to work with the usual setTimout()
inconsistencies even if it can trigger some
milliseconds before the asked delay.
Name | Type | Description |
---|---|---|
amount |
number | An amount of time in milliseconds |
- Source:
A promise that will be resolved after the given amount of time has passed.
- Type
- Promise
import { sleepPrecise, asyncRoot } from 'modern-async'
asyncRoot(async () => {
await sleepPrecise(100) // will wait 100ms
})
# sleepPreciseCancellable(amount) → {Array}
Waits a given amount of time.
This function returns both a promise and cancel function in order to cancel the
wait time if necessary. If cancelled, the promise will be rejected with a CancelledError
.
This function is similar to sleep()
except it ensures that the amount of time measured
using the Date
object is always greater than or equal the asked amount of time.
This function can imply additional delay that can be bad for performances. As such it is
recommended to only use it in unit tests or very specific cases. Most applications should
be adapted to work with the usual setTimout()
inconsistencies even if it can trigger some
milliseconds before the asked delay.
Name | Type | Description |
---|---|---|
amount |
number | An amount of time in milliseconds |
- Source:
A tuple of two objects:
promise
: The promisecancel
: The cancel function. It will return a boolean that will betrue
if the promise was effectively cancelled,false
otherwise.
- Type
- Array
import { sleepPreciseCancellable, asyncRoot } from 'modern-async'
asyncRoot(async () => {
const [promise, cancel] = sleepPreciseCancellable(100) // schedule to resolve the promise after 100ms
cancel()
try {
await promise
} catch (e) {
console.log(e.name) // prints CancelledError
}
})
# (async) some(iterable, iteratee) → {Promise}
Returns true
if at least one element of an iterable pass a truth test and false
otherwise.
The calls to iteratee
will run in parallel. If any truth test returns true
the promise is immediately resolved.
In case of exception in one of the iteratee
calls the promise returned by this function will be rejected
with the exception. In the very specific case where a test returns true
and an already started task throws
an exception that exception will be plainly ignored.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
A promise that will be resolved to true
if at least one value pass the truth test and false
if none of them do. That promise will be rejected if one of the truth test throws an exception.
- Type
- Promise
import { some, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await some(array, async (v) => {
// these calls will be performed in parallel
await sleep(10) // waits 10ms
return v % 2 === 0
})
console.log(result) // prints true
// total processing time should be ~ 10ms
})
# (async) someLimit(iterable, iteratee, concurrency) → {Promise}
Returns true
if at least one element of an iterable pass a truth test and false
otherwise.
The calls to iteratee
will run in parallel, up to a concurrency limit. If any truth test returns true
the promise is immediately resolved.
Whenever a test returns true
, all the remaining tasks will be cancelled as long
as they didn't started already. In case of exception in one of the iteratee
calls the promise
returned by this function will be rejected with the exception and the remaining pending
tasks will also be cancelled. In the very specific case where a test returns true
and an
already started task throws an exception that exception will be plainly ignored.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
concurrency |
number | The number of times |
- Source:
A promise that will be resolved to true
if at least one value pass the truth test and false
if none of them do. That promise will be rejected if one of the truth test throws an exception.
- Type
- Promise
import { someLimit, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await someLimit(array, async (v) => {
// these calls will be performed in parallel with a maximum of 2
// concurrent calls
await sleep(10) // waits 10ms
return v % 2 === 0
}, 2)
console.log(result) // prints true
// total processing time should be ~ 10ms
})
# (async) someSeries(iterable, iteratee) → {Promise}
Returns true
if all elements of an iterable pass a truth test and false
otherwise.
The calls to iteratee
will run sequentially. If any truth test returns true
the promise is
immediately resolved.
In case of exception in one of the iteratee calls the promise returned by this function will be rejected with the exception and the remaining pending tasks will be cancelled.
Name | Type | Description |
---|---|---|
iterable |
Iterable | An iterable object. |
iteratee |
function | A function that will be called with each member of the iterable. It will receive three arguments:
|
- Source:
A promise that will be resolved to true
if at least one value pass the truth test and false
if none of them do. That promise will be rejected if one of the truth test throws an exception.
- Type
- Promise
import { someSeries, asyncRoot, sleep } from 'modern-async'
asyncRoot(async () => {
const array = [1, 2, 3]
const result = await someSeries(array, async (v) => {
// these calls will be performed sequentially
await sleep(10) // waits 10ms
return v % 2 === 0
})
console.log(result) // prints true
// total processing time should be ~ 20ms
})
# (async) timeout(fct, amount) → {Promise}
Wraps a call to an asynchronous function to add a timer on it. If the delay is exceeded
the returned promise will be rejected with a TimeoutError
.
This function uses setTimeout()
internally and has the same behavior, notably that it could reject
after the asked time (depending on other tasks running in the event loop) or a few milliseconds before.
Name | Type | Description |
---|---|---|
fct |
function | An asynchronous function that will be called immediately without arguments. |
amount |
number | An amount of time in milliseconds |
- Source:
A promise that will be resolved or rejected according to the result of the call
to fct
. If amount
milliseconds pass before the call to fct
returns or rejects, this promise will
be rejected with a TimeoutError
.
- Type
- Promise
import { timeout, sleep, asyncRoot } from 'modern-async'
asyncRoot(async () => {
// the following statement will perform successfully because
// the function will return before the delay
await timeout(async () => {
await sleep(10)
}, 100)
try {
// the following statement will throw after 10ms
await timeout(async () => {
await sleep(100)
}, 10)
} catch (e) {
console.log(e.name) // prints TimeoutError
}
})
# (async) timeoutPrecise(fct, amount) → {Promise}
Wraps a call to an asynchronous function to add a timer on it. If the delay is exceeded
the returned promise will be rejected with a TimeoutError
.
This function is similar to timeout()
except it ensures that the amount of time measured
using the Date
object is always greater than or equal the asked amount of time.
This function can imply additional delay that can be bad for performances. As such it is
recommended to only use it in unit tests or very specific cases. Most applications should
be adapted to work with the usual setTimout()
inconsistencies even if it can trigger some
milliseconds before the asked delay.
Name | Type | Description |
---|---|---|
fct |
function | An asynchronous function that will be called immediately without arguments. |
amount |
number | An amount of time in milliseconds |
- Source:
A promise that will be resolved or rejected according to the result of the call
to fct
. If amount
milliseconds pass before the call to fct
returns or rejects, this promise will
be rejected with a TimeoutError
.
- Type
- Promise
import { timeoutPrecise, sleep, asyncRoot } from 'modern-async'
asyncRoot(async () => {
// the following statement will perform successfully because
// the function will return before the delay
await timeoutPrecise(async () => {
await sleep(10)
}, 100)
try {
// the following statement will throw after 10ms
await timeoutPrecise(async () => {
await sleep(100)
}, 10)
} catch (e) {
console.log(e.name) // prints TimeoutError
}
})