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

如何为useAsync钩子接收的异步函数新增Token作为额外参数

解决方案

你不需要用bind也可以实现需求,直接在获取到token后,将token作为参数传递给你传入的异步函数即可,同时可以兼容调用execute时传入的自定义参数,顺便修复原代码中的拼写错误、未闭合括号等问题:

改造后的useAsync钩子

const useAsync = (asyncFunction, immediate = true) => {
  // 用async/await简化嵌套then逻辑,同时透传execute调用时传入的所有参数
  const execute = useCallback(async (...args) => {
    const token = await getAccessToken();
    // 把token作为第一个参数传入异步函数,后面拼接execute收到的其他自定义参数
    const response = await asyncFunction(token, ...args);
    console.log('SUCCESS', response);
    return response;
  }, [asyncFunction]);

  // 如果你需要保留原钩子的immediate自动执行逻辑,在这里补对应useEffect即可
  return { execute };
}

业务端调用代码调整

你传入useAsync的异步函数需要接收token作为第一个参数:

const Component = () => {
  // 第一个参数接收useAsync自动注入的token
  const getFile = async (token) => {
    // 可自行把token添加到请求头、payload等位置
    const payload = { fileId, token };
    return getFileInfo(payload);
  };

  const { execute  } = useAsync(getFile, false);
  useEffect(() => {execute()}, []);
}

可选:如果要保持原异步函数参数顺序,把token放在最后

只需要修改useAsync中调用异步函数的参数顺序即可,业务端无需调整原有参数:

// token作为最后一个参数传入
const response = await asyncFunction(...args, token);

bind写法的实现方案

如果要使用bind实现,正确写法如下,之前未实现成功大概率是没有执行bind返回的新函数,或者参数顺序错误:

const useAsync = (asyncFunction, immediate = true) => {
  const execute = useCallback(() => {
    return getAccessToken().then((token) => { 
      // bind第一个参数是this指向,后面的是预绑定的参数,最后加()执行新函数
      return asyncFunction.bind(null, token)()
        .then((response) => {
          console.log('SUCCESS', response)
        })
    })
  }, [asyncFunction]);

  return { execute };
}

内容的提问来源于stack exchange,提问作者Scott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:45:02