I’m trying to execute some async tasks in parallel with a limitation on the maximum number of simultaneously running tasks.
There’s an example of what I want to achieve:
Currently this tasks are running one after another. It’s implemented this way:
export function signData(dataItem) {
cadesplugin.async_spawn(async function* (args) {
//... nestedArgs assignment logic ...
for (const id of dataItem.identifiers) {
yield* idHandler(dataItem, id, args, nestedArgs);
}
// some extra logic after all tasks were finished
}, firstArg, secondArg);
}
async function* idHandler(edsItem, researchId, args, nestedArgs) {
...
let oDocumentNameAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");
yield oDocumentNameAttr.propset_Value("Document Name");
...
// this function mutates some external data, making API calls and returns void
}
Unfortunately, I can’t make any changes in cadesplugin.*
functions, but I can use any external libraries (or built-in Promise
) in my code.
I found some methods (eachLimit and parallelLimit) in async library that might work for me and an answer that shows how to deal with it.
But there are still two problems I can’t solve:
- How can I pass main params into nested function?
- Main function is a generator function, so I still need to work with yield expressions in main and nested functions
There’s a link to cadesplugin.* source code, where you can find async_spawn (and another cadesplugin.*
) function that used in my code.
That’s the code I tried with no luck:
await forEachLimit(dataItem.identifiers, 5, yield* async function* (researchId, callback) {
//... nested function code
});
It leads to Object is not async iterable error.
Another attempt:
let functionArray = [];
dataItem.identifiers.forEach(researchId => {
functionArray.push(researchIdHandler(dataItem, id, args, nestedArgs))
});
await parallelLimit(functionArray, 5);
It just does nothing.
Сan I somehow solve this problem, or the generator functions won’t allow me to do this?