-
-
Notifications
You must be signed in to change notification settings - Fork 100
/
Copy pathcacheApi.js
157 lines (107 loc) · 3.46 KB
/
cacheApi.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
* Author : OBKoro1
* Date : 2021-10-27 17:36:48
* LastEditors : OBKoro1
* LastEditTime : 2021-10-27 17:36:50
* FilePath : /js-base/src/scene/cacheApi.js
* description : 缓存异步接口
* 快手一面 有点难
* koroFileheader VSCode插件
* Copyright (c) 2021 by OBKoro1, All Rights Reserved.
*/
/**
* 缓存异步接口
* - 第一次请求缓存接口的时候,和调用原异步接口效果一样
* - 缓存接口根据入参缓存原异步接口返回值
* - 有缓存值的时候,马上返回缓存值,并发起请求更新缓存值
* - 对于同样的入参,缓存接口同一时刻,最多只会发起一个请求
* @param fn 原异步接口
* @returns 缓存接口
*/
function cacheApi(...args) {
console.log('补充代码')
}
/**
* mock api
*/
const mockApi = (() => {
let id = 0
return async (req) => {
await new Promise((r) => setTimeout(r, 1000))
return {
req,
id: id++,
}
}
})()
/**
* 缓存的接口
*/
const cachedApi = cacheApi(mockApi);
(async () => {
console.log('111',
await Promise.all([cachedApi('a'), cachedApi('b'), cachedApi('a')]))
// 一秒钟后输出 [ { req: "a", id: 0 }, { req: "b", id: 1 }, { req: "a", id: 0 } ]
console.log(
await Promise.all([cachedApi('a'), cachedApi('b'), cachedApi('a')]),
)
// 马上输出 [ { req: "a", id: 0 }, { req: "b", id: 1 }, { req: "a", id: 0 } ]
await new Promise((r) => setTimeout(r, 1000))
console.log(
await Promise.all([cachedApi('a'), cachedApi('b'), cachedApi('a')]),
)
// 马上输出 [ { req: "a", id: 2 }, { req: "b", id: 3 }, { req: "a", id: 2 } ]
})()
// 答案慎看
/**
* 缓存异步接口
* - 第一次请求缓存接口的时候,和调用原异步接口效果一样
* - 缓存接口根据入参缓存原异步接口返回值
* - 有缓存值的时候,马上返回缓存值,并发起请求更新缓存值
* - 对于同样的入参,缓存接口同一时刻,最多只会发起一个请求
* @param fn 原异步接口
* @returns 缓存接口
*/
// function cacheApi(...args) {
// // 补充代码实现
// let map = {}
// let list = []
// let fn = args[0]
// return async function help(key) {
// // 同时只有一个接口,判断锁
// if (map[key] && map[key].lock === true) {
// // 接口已经有过值了 直接返回接口
// if (map[key].data) {
// return map[key].data
// } else {
// // 接口正在进行第一次请求
// return await map[key].promise
// }
// }
// // 初始化
// if (!map[key]) {
// map[key] = {}
// // 缓存同一个promise 同一个参数等待他完成
// map[key].promise = fn(key)
// map[key].lock = true
// map[key].data = null
// }
// // 返回缓存值
// if (map[key].data) {
// map[key].lock = true
// map[key].promise = fn(key)
// // 下次异步更改数据
// map[key].promise.then(res => {
// map[key].data = res
// map[key].lock = false
// })
// return map[key].data
// } else {
// // 第一次请求
// let res = await map[key].promise
// map[key].data = res
// map[key].lock = false
// return res
// }
// }
// }