single-promises
library

Concurrency merge laboratory

五次调用,
一次执行。

点击一次按钮会同时调用 5 次。
singlePromise 只让原函数执行 1 次,其余 4 次等待并共享同一个结果。

Live request router
准备就绪
5 次调用进入 1 次原函数执行

它是怎么工作的

CALL调用进入包装函数
CACHE?先检查结果缓存
PENDING?再检查执行中 Promise
RUN必要时执行原函数
RESULT向所有调用分发结果

每个调用收到的结果

点击“并发调用 5 次”,观察五条调用如何共享一次真实执行。

实际执行通道 IDLE
等待实验 页面会直接使用 === 比较 Promise 对象。 点击并发调用查看结论。

Runnable pattern

实例代码

上方动画对应的最小实现。前两个调用发生在响应前,因此返回同一个 Promise;响应完成后,在缓存有效期内再次调用会直接使用缓存结果。

绿色数值会与实验控制中的滑块同步。
JavaScriptsingle-promises
import { singlePromise } from 'single-promises'

const request = () => new Promise((resolve) => {
  setTimeout(() => resolve(Date.now()), 1200)
})

const getData = singlePromise(request, {
  cache: 3000,
})

const p1 = getData()
const p2 = getData()

console.log(p1 === p2) // true:p1 还未响应,共用同一个 Promise

await p1
await getData()      // 缓存有效期内,使用缓存结果

getData.clear()       // 清除缓存,下次重新执行 request