需求
有一个 HTTP 接口 A,后端会执行一段异步任务 发一个 HTTP 请求到 B 站点,B 站点异步执行后 callback A 站点的 HTTP 接口。
我想客户端请求的时候阻塞一下 A <---> B 这个过程,让客户端使用 A 的时候基本无感,有没有什么比较好的处理方案?
现有方案
标记每一个请求,A 接口上轮询等待 B 接口的返回结果。有其他更好的事件流或者闭包处理方案吗? 伪代码
const POOL = {}
function sleep(timer = 100) {
return new Promise(resolve => {
setTimeout(resolve, timer)
})
}
// 客户端请求的接口
async function handle(ctx) {
const tid = Math.random().toString()
await axios.post('xxx', { tid })
POOL[tid] = null
for (let i = 0; i <= 100; i++) {
// 轮询 POOL 有没有返回值
if (POOL[tid]) {
break
}
await sleep()
}
const res = POOL[tid]
if (!res) {
ctx.throw(500)
}
ctx.body = res
}
async function callback() {
const { tid, payload } = ctx.request.body
if (POOL[tid] !== undefined) {
POOL[tid] = payload
}
ctx.body = 'ok'
}