You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
3.7 KiB
HTML

7 months ago
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
export default {
data() {
return {
eventSource: null,
stateData: null,
list: [],
connectStatus: false,
};
},
created() {
},
methods: {
startConnectHandler() {
let url = "http://127.0.0.1:3000/sse/ai/question/push?title=请你介绍一下SSE";
// 表示与服务器建立连接的 URL。必填。
const sseObj = new EventSource(url);
this.eventSource = sseObj;
console.log('状态', sseObj, this.eventSource)
if (sseObj.readyState === 0) {
this.connectStatus = true
//sseObj.readyState === EventSource.CONNECTING 也可以判断正在连接服务器
console.log('0:"正在连接服务器...');
}
sseObj.onopen = (e) => {
if (sseObj.readyState === 1) {
// sseObj.readyState === EventSource.OPEN 也可以判断连接成功
let data = `SSE 连接成功,状态${sseObj.readyState}, 对象${e}`;
this.stateData = data;
console.log("1:SSE 连接成功");
}
};
// 接收消息,这个事件需要和后端保持一致哈
// 后端的事件名称sseEvent
sseObj.addEventListener("sseEvent", (event) => {
const data = JSON.parse(event.data);
//如果最后推送的是 'contDnd',说明推送已经完了。此时关闭连接
if (data.content === 'contDnd') {
this.endConnectHandler()
} else {
this.list.push(data.content);
}
console.log("这次消息推送的内容event:", data.content);
});
sseObj.onerror = (e) => {
console.log("error", e);
};
},
endConnectHandler() {
if (this.eventSource) {
this.connectStatus = false
this.eventSource.close();
if (this.eventSource.readyState === 2) {
// sseObj.readyState === EventSource.CLOSED 也可以判断连接已经关闭
console.log('2连接已经关闭。', this.eventSource, this.eventSource.readyState);
}
console.log("end");
}
},
},
};
</script>
<style scoped>
.chat-box {
padding-left: 20px;
padding-top: 20px;
}
button {
margin-right: 20px;
padding: 6px;
}
</style>
</head>
<body>
<template>
<div class="chat-box">
<button @click="startConnectHandler" :disabled="connectStatus">建立连接</button>
<button @click="endConnectHandler">关闭连接</button>
<h2>
<p>连接状态{{ this.eventSource && this.eventSource.readyState }}</p>
</h2>
<h2>下面就是返回来的数据</h2>
<div>
<div v-for="(item, index) in list" :key="index">
{{ item }}
</div>
</div>
</div>
</template>
</body>
</html>