Trying to figure-out how to find something that functional exactly like async.eachSeries, i need a list of async actions run in sequence (not in parallel) but can't find a way to do it in native ES6, can anyone advise, please?
p.s. thought about generators/yield but don't have the experience yet so I'm not realized how exactly it can help me.
Edit 1
per request, here is an example:
Assume this code:
let model1 = new MongooseModel({prop1: "a", prop2: "b"});
let model2 = new MongooseModel({prop1: "c", prop2: "d"});
let arr = [model1 , model2];
Now, I want to run over it in a series, not parallel, so with the "async" NPM it's easy:
async.eachSeries(arr, (model, next)=>{
model.save.then(next).catch(next);
}, err=>{
if(err) return reject(error);
resolve();
})
My question is: with ES6, can I do it natively? without the NPM 'async' package?
Edit 2
With async/await it can be done easily:
let model1 = new MongooseModel({prop1: "a", prop2: "b"});
let model2 = new MongooseModel({prop1: "c", prop2: "d"});
let arr = [model1 , model2];
for(let model of arr){
await model.save();
}
As an extension to the answer provided by @jib... you can also map an array of items to async functions like so:
Notice how
prev_result
will be the value returned by the previous evaluation ofsomething_async
, this is roughly equivalent to a hybrid betweenasync.eachSeries
andasync.waterfall
.For those who like short answers:
Let's say you want to call some async function on an array of data and you want them called sequentially, not in parallel.
The interface for
async.eachSeries()
is like this:Here's how to simulate that with promises:
This assumes that
iteratorFn
takes the item to process as an argument and that it returns a promise.Here's a usage example (that assumes you have a promisified
fs.readFileAsync()
) and have a function calledspeak()
that returns a promise when done:This lets the promise infrastructure sequence everything for you.
It is also possible for you to sequence things manually (though I'm not sure why):
Or, a simpler version that manually chains the promises together:
Note how one of the manual versions has to surround
iteratorFn()
withtry/catch
in order to make sure it is throw-safe (convert exceptions into a rejection)..then()
is automatically throw safe so the other schemes don't have to manually catch exceptions since.then()
already catches them for you.You can chain by returning in the
then
callback. For instance:Will print:
This of course work when asynchronously resolving promises:
Printing:
//Uploading this for systems that run lower nodejs version (Azure :/) Not the shortest but the nicest i can think of
for example lets say "functionWithPromise" returns some promise and expects some item.