Springhead

Je voudrais mourir pendant mon sommeil.

0%

记录一下上周遇到的问题和解决方法。

antd pro官方推荐了dva进行数据流管理,因为官网有教程就不细说原理了,主要讲一下遇到的问题。

使用dva进行状态管理时出现了一个需求,需要使用同一个接口的不同query参数的返回值作为不同页面的展示数据。

但当某个需要query参数过滤的页面使用useEffect配合dispatch修改数据后,一下子出现了两次请求。当然,这个现象很合理。

一次是没加query参数的请求,一次是加上的。但是我没办法控制页面到底获取的是哪次请求获得的数据,实际上看下来好像拿到的都是第一次没加参数的数据,这当然不是我想要的。

本来有个做法是在获取请求并处理数据的hook这一层做一个判断,当有参数时使用第一种方式取值,没有时使用第二种。但是hook中useEffect的依赖项又出现了dispatch后一定会改变的值,导致了数据无限刷新。所以这个方法不行。

后来在同事的帮助下使用了lodash中的debounce做了一个去抖。

debounce: 当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间。

实际在请求这个数据时,第一次请求是初始定义的没有参数的请求,第二次则是在使用了dispatch修改了请求参数导致的再请求,因为两次的间隔很短,而我们只需要第二次的请求结果,所以可以直接取消第一次的请求。

大致做法是使用下面这个函数替换掉原来的dispatch部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const debouncePatch = debounce(
({params,dispatch}) =>
dispatch({type: "fetchData", payload: {params}}),
200,
)

//原本的写法
dispatch({
type: "fetchData",
payload: {params},
})

//替换的写法
debouncePatch({
dispatch,
params,
})

之前是输入 hexo 命令是可以正常启动的,今天试着写第一篇文章发现hexo的命令都用不了,会报下面这个错。

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
(node:28558) ExperimentalWarning: The fs.promises API is experimental
INFO Validating config
INFO Start processing
FATAL { err:
TypeError: line.matchAll is not a function
at res.value.res.value.split.map.line (/blog/blog/node_modules/hexo-util/lib/highlight.js:128:26)
at Array.map (<anonymous>)
at closeTags (/blog/blog/node_modules/hexo-util/lib/highlight.js:126:37)
at highlight (/blog/blog/node_modules/hexo-util/lib/highlight.js:119:10)
at highlightUtil (/blog/blog/node_modules/hexo-util/lib/highlight.js:23:16)
at data.content.dataContent.replace (/blog/blog/node_modules/hexo/lib/plugins/filter/before_post_render/backtick_code_block.js:92:17)
at String.replace (<anonymous>)
at Hexo.backtickCodeBlock (/blog/blog/node_modules/hexo/lib/plugins/filter/before_post_render/backtick_code_block.js:19:30)
at Hexo.tryCatcher (/blog/blog/node_modules/bluebird/js/release/util.js:16:23)
at Hexo.<anonymous> (/blog/blog/node_modules/bluebird/js/release/method.js:15:34)
at Promise.each.filter (/blog/blog/node_modules/hexo/lib/extend/filter.js:67:52)
at tryCatcher (/blog/blog/node_modules/bluebird/js/release/util.js:16:23)
at Object.gotValue (/blog/blog/node_modules/bluebird/js/release/reduce.js:166:18)
at Object.gotAccum (/blog/blog/node_modules/bluebird/js/release/reduce.js:155:25)
at Object.tryCatcher (/blog/blog/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/blog/blog/node_modules/bluebird/js/release/promise.js:547:31)
at Promise._settlePromise (/blog/blog/node_modules/bluebird/js/release/promise.js:604:18)
at Promise._settlePromiseCtx (/blog/blog/node_modules/bluebird/js/release/promise.js:641:10)
at _drainQueueStep (/blog/blog/node_modules/bluebird/js/release/async.js:97:12)
at _drainQueue (/blog/blog/node_modules/bluebird/js/release/async.js:86:9)
at Async._drainQueues (/blog/blog/node_modules/bluebird/js/release/async.js:102:5)
at Immediate.Async.drainQueues [as _onImmediate] (/blog/blog/node_modules/bluebird/js/release/async.js:15:14) } 'Something\'s wrong. Maybe you can find the solution here: %s' '\u001b[4mhttps://hexo.io/docs/troubleshooting.html\u001b[24m'

随便搜了一下没发现解决办法,后来想了下可能是node版本问题。
因为第一次用hexo启动时我在提示下会切换到 v12.4.0 版本,今天重新开了一个命令行后node版本就不对了,我用的又是比较新的hexo版本,系统默认的node版本又比较旧。

可以尝试用nvm切换node版本到v12.4.0,下面是我正常启动的版本信息以供参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
% hexo -v
INFO Validating config
hexo: 5.4.0
hexo-cli: 4.2.0
os: Darwin 19.6.0 darwin x64
node: 12.4.0
v8: 7.4.288.27-node.18
uv: 1.29.1
zlib: 1.2.11
brotli: 1.0.7
ares: 1.15.0
modules: 72
nghttp2: 1.38.0
napi: 4
llhttp: 1.1.3
http_parser: 2.8.0
openssl: 1.1.1b
cldr: 35.1
icu: 64.2
tz: 2019a
unicode: 12.1

这实际是一篇测试文章,写的比较简单。