当我们使用微信小程序对接ai功能时一般都需要打字机效果,一般ai接口都是sse协议,但是微信小程序不支持,垃圾东西,阉割了h5标准功能。我们需要给微信小程序模拟支持下。代码如下:
类库如下:
class EventSource { constructor(url, retryTime = 0) { this.url = url; this.retryTime = retryTime; this.listeners = {}; this.requestTask = null this.connect() } connect() { this.requestTask = wx.request({ url: this.url, enableChunked: true, responseType: 'text', method: 'GET', timeout: 300e3, success: res => { this.emit('success', res) if (this.retryTime > 0) { setTimeout(() => { this.connect() }, this.retryTime) } }, fail: () => { } }); this.requestTask.onHeadersReceived(res => { this.emit('open', res); }) this.requestTask.onChunkReceived(res => this.handleChunk(res)) } handleChunk(res) { console.log('ok'); const arrayBuffer = res.data; const uint8Array = new Uint8Array(arrayBuffer); let data = uni.arrayBufferToBase64(uint8Array) data = new Buffer(data, 'base64') data = data.toString('utf8') const lines = data.split("\n\n") lines.forEach(line => { if (!line.trim()) { return } const [key, value] = line.trim().split(':'); if (key === 'data') { const data = line.substring(5).trim(); try { const json = JSON.parse(data); this.emit('message', { data: json }) } catch (e) { this.emit('error', 'Api.EventSource.ParseError:' + e) } } else { this.emit('error', 'Api.EventSource.ParseFail:' + line) } }) } addEventListener(event, callback) { if (!this.listeners[event]) { this.listeners[event] = [] } this.listeners[event].push(callback) } emit(event, data) { if (this.listeners[event]) { this.listeners[event].forEach(callback => { callback(data) }); } } close() { if (this.requestTask) { this.requestTask.abort() } } } module.exports = EventSource;
调用方式参考例子:
const es = new EventSource('http://api.20230611.cn/api/question/aiExplanation?id=' + item.id) es.addEventListener('open', res => { that.showAiExplanation = status; }); es.addEventListener('message', (event) => { console.log('message'); });
虽然支持了微信小程序,但是uniapp是基于webview实现,webview中不支持EventSource,太折腾了所以放弃了sse作为多平台协议的支持,还是websocket支持比较多。
window.setInterval(method,time)方法本身会返回一个资源句柄,使用clearInterval(Intervalid)方法即可清除定时器<script> var num=0; //每隔1秒再控制台输...
https://3gimg.qq.com/lightmap/v1/marker/index.html?marker=coord:37.6767600000,112.7297800000&key=TKUBZ-D24AF-GJ4JY-JDVM2-IBYKK-KEBCU&referer=p...
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body>...
通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对。它可以更灵活方便的发送表单数据,因为可以独立于表单使用。如果你把表单的编码类型设置为multipart/form-data ,则通过FormData传输的数据格式和表单通过submit() 方法传输的数据格式相同...
二期项目中生成的简历二维码是使用canvs生成的,微信浏览器中不能识别二维码,只能扫码。懒的换phpqrcode,于是转canvs。//设置一个url var url = "{yun:}$config.sy_weburl{/yun}/mingli/index....
维护老项目中客户提到一个页面中有6个表单以上,导致每次保存一个其他的数据全部丢失,自己比较懒没有全部更换为ajax.用户每次输入完成或者选择完成记录cookie,每次提交后加载页面完成初始化cookie即可。以下代码取自w3school比较完善,之前在其他博客使用的经常出现bug,这个比较推荐使用:...