You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求问下述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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:45:03