В следующем коде определяется функция latest
, которая может быть применена к функции, чтобы обеспечить выполнение только последнего вызова до завершения.
Переменная curr
записывает последний вызов, сохраняя последнее обещание , Функция сконфигурирована в позиции then
для обеспечения продолжения. Прогресс в цепочке обещаний разрешается только в том случае, если обещание в процессе выполнения равно curr
. ie. последующий вызов не перезаписал curr
за это время.
Таким образом, распечатывается следующий код: stale two
.
function latest(fn) {
let curr = null
return (...args) => {
let p = fn(...args).then((result) => {
if(p === curr) return result
else throw 'stale'
})
curr = p
return p
}
}
const doSomething = (v, ms) => new Promise((r)=> setTimeout(() => r(v), ms))
const latestDoSomething = latest(doSomething)
latestDoSomething('one', 100).then(console.log).catch(console.log)
latestDoSomething('two', 100).then(console.log).catch(console.log)