求问下述JS代码中request函数的cb参数传入的是哪一个回调函数?
核心问题解答
你混淆了参数传递的方向和身份:传给cb的不是json,你调用request时传入的第二个箭头函数才是cb本身,逻辑拆分如下:
1. 先看request函数的定义规则
const request = (path, cb) => fetch(path) .then((res) => { if (res.ok) return res.json() throw Error('HTTP error: ' + res.status) }) .then(cb) // 这里会把上一步拿到的接口JSON结果,作为入参调用你传入的cb函数 .catch((err) => ($('result').innerHTML = err))
它的第二个参数要求传入一个函数作为回调,fetch请求成功拿到接口返回的JSON后,会自动把这个JSON作为入参执行你传入的回调函数。
2. 再看你调用request的传参
const id = await request(`./qrcode?pin=${pinRequired}`, (json) => { const { qrbase64, deeplink, pin, id } = json $('qrcode').innerHTML = `<img src="${qrbase64}" alt="Red dot" />` $('deeplink').innerHTML = `<a href=${deeplink} target="_blank"> ${deeplink.slice(0, 90)}...</a>` $('pin').innerHTML = pin ? pin : 'Not requested' return id })
你这里传入的第二个参数(json) => { ... }就是cb回调本身:
json是这个回调的形参,它的值就是request内部fetch拿到的接口返回的JSON对象,不是你传给cb的参数- 形参外面的圆括号是箭头函数的可选写法,
(json) => {}和json => {}完全等价,不是你误以为的“对象”
3. 补充await取值的逻辑
request本身返回的是fetch生成的Promise实例,它的最终resolve值就是你写的回调函数的返回值(也就是接口返回的id字段),所以你可以用await拿到这个id给后续的轮询逻辑使用。
你后面setInterval里的request调用遵循完全相同的规则:第二个参数({ status }) => ($('result').innerHTML = status)就是回调函数,接口返回的JSON会被解构拿出status字段赋值到页面。
这个回调完全定义在你当前贴出的代码片段内,不需要从其他文件或者后端获取。
内容的提问来源于stack exchange,提问作者tkirisame
相关产品推荐
相关产品推荐

