Delays between promises in promise chain
The answers are good, but they wait too long since all the answers wait regardless of whether or not the actual operation took more than 50ms already.
You can use Promise.all
for it.
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
let parameterArr = ['a','b','c','d','e','f'];
parameterArr.reduce(function(promise, item) {
return promise.then(function(result) {
return Promise.all([delay(50), myPromise(item)]);
});
}, Promise.resolve());
A really handy utility function to have around is something I call delay()
:
function delay(t, val) {
return new Promise(function(resolve) {
if (t <= 0) {
resolve(val);
} else {
setTimeout(resolve.bind(null, val), t);
}
});
}
Then, you can use it in a promise chain like this:
let paramerterArr = ['a','b','c','d','e','f']
parameterArr.reduce(function(promise, item, index) {
return promise.then(function(result) {
// no delay on first iteration
var delayT = index ? 50 : 0;
return delay(delayT, item).then(mySpecialFunction);
})
}, Promise.resolve());
You could also make a little utility function for doing the sequential iteration with optional delay:
// delayT is optional (defaults to 0)
function iterateSerialAsync(array, delayT, fn) {
if (!fn) {
fn = delayT;
delayT = 0;
}
array.reduce(function(p, item, index) {
return p.then(function() {
// no delay on first iteration
if (index === 0) delayT = 0;
return delay(delayT, item).then(fn)
});
}, Promise.resolve());
}
And, then you would use it like this:
iterateSerialAsync(paramerterArr, 50, mySpecialFunction).then(function(finalVal) {
// all done here
});
To get a delay of at least 50ms, use Promise.all
:
function delay(t) {
return new Promise(function(resolve) {
setTimeout(resolve, t);
});
}
parameterArr.reduce(function(promise, item) {
return promise.then(function() {
return Promise.all([
mySpecialFunction(item),
delay(50)
]);
});
}, Promise.resolve());