javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > js流式模式输出

JS流式模式输出函数模式使用详解

作者:任平安.

文章介绍了传统接口模式与AI项目需求不符的问题,提出了流式模式和回调函数模式来解决,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

一、传统模式:一次性返回完整结果

我们平时写接口大多是这样:

async function getAnswer(question: string): Promise<string> {
  const result = await callAI(question); // 等待完整结果(可能需要几秒)
  return result; // 一次性返回
}
// 控制器中
const answer = await service.getAnswer(question);
ctx.body = { data: answer };

如果开发 ai 相关的项目

问题:用户必须等待 AI 生成完整个回答才能看到内容。如果 AI 生成需要 10 秒,用户就白屏等待 10 秒,体验很差。

二、流式模式:边生成边返回

我们希望 AI 每生成一个字,就立刻推送给用户。但 HTTP 响应只能发送一次,不能先返回一部分再返回另一部分。解决办法是:

这就是 回调函数模式 的应用场景。

三、回调函数模式模拟

想象你有一个函数 generate,它模拟 AI 逐字产生结果:

// 模拟 AI 逐字生成
function simulateAI(word: string, callback: (token: string) => void) {
  for (const ch of word) {
    setTimeout(() => callback(ch), 100); // 每 100ms 输出一个字符
  }
}

如果不用回调,我们可能会写:

function generateSync(word: string): string {
  let result = '';
  for (const ch of word) {
    result += ch;
    // 无法在这里把中间结果返回给调用方,因为函数还没结束
  }
  return result; // 只能最后一次性返回
}

使用回调后,调用方可以这样:

simulateAI('你好', (token) => {
  console.log('收到 token:', token); // 会打印三次:你、好
});


回调函数 (token) => { ... } 就像是“收到数据时的处理指令”。simulateAI 每产生一个字,就执行这个指令,把字传出去。

代码中的实际应用

BusinessChatService.chatStream 中:

async chatStream(input: string, onToken: (token: string) => void) {
  // ... 调用 LM Studio 流式 API
  for await (const chunk of stream) {
    // 解析出 token
    const token = parsed.choices[0]?.delta?.content;
    if (token) {
      onToken(token); // 每得到一个 token,就调用外部传入的回调
    }
  }
}

控制器调用时:

await service.chatStream(input, (token) => {
  res.write(`data: ${JSON.stringify({ token })}\n\n`); // 将 token 写入 HTTP 响应
});

关键点

六、类比帮助你理解

想象你在厨房做菜(AI 生成回答),服务员(控制器)站在门口等。

服务员怎么知道菜做好了?你每完成一道菜就喊一声“上菜!”(调用回调函数)。服务员听到后就把菜端走(写入 HTTP 响应)。

在你的代码中:

七、总结

到此这篇关于JS流式模式输出函数模式使用详解的文章就介绍到这了,更多相关js流式模式输出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文