zjowowen's picture
init space
079c32c
raw
history blame
4.08 kB
/*
这段代码是一个JavaScript模块,用于与Web Worker进行通信。Web Worker可以在后台线程中执行代码,使得主线程(通常是UI线程)不会因为复杂的或者耗时的任务而被阻塞。
在这个例子中,Web Worker 负责执行一个名为 MinmaxWorker 的任务,可能是一个实现了极小化极大算法(Minimax Algorithm)的工作线程,它通常用于棋类游戏中的人工智能决策。
该模块提供了四个函数:start, move, end, 和 undo,
每个函数都通过 worker.postMessage 发送一个包含 action 和其他必要信息的对象给Worker。
Worker接收这些信息后将执行相应的AI计算任务,完成后通过 worker.onmessage 将结果信息传回给主线程。
每个函数返回一个Promise对象,这意味着它们都是异步的,可以在未来的某个时间点解决(resolve)或拒绝(reject)。
主线程在接收到信息后,通过 resolve 方法将Promise对象的状态改为已解决,并返回结果数据,从而可以在异步函数中使用 await 表达式获取这些数据。
*/
// bridge.js: 从当前目录下的'minmax.worker'文件导入MinmaxWorker类
import MinmaxWorker from './minmax.worker';
// 创建MinmaxWorker的实例
const worker = new MinmaxWorker();
// `start` 函数,异步初始化游戏,传入棋盘大小、AI是否先手和搜索深度
export const start = async (board_size, aiFirst, depth) => {
// 返回一个新的Promise对象
return new Promise((resolve, reject) => {
// 向worker发送初始化游戏的消息
worker.postMessage({
action: 'start',
payload: {
board_size, // 棋盘大小
aiFirst, // AI是否先手
depth // 搜索深度
},
});
// 当worker发送消息回来时触发
worker.onmessage = (event) => {
// 从事件中解构出action和payload
const { action, payload } = event.data;
// 如果action是'start',则解决(resolve)这个promise
if (action === 'start') {
resolve(payload);
}
};
})
};
// `move` 函数,异步执行一个移动,传入移动的位置和搜索深度
export const move = async (position, depth) => {
// 返回一个新的Promise对象
return new Promise((resolve, reject) => {
// 向worker发送执行移动的消息
worker.postMessage({
action: 'move',
payload: {
position, // 移动的位置
depth // 搜索深度
},
});
// 当worker发送消息回来时触发
worker.onmessage = (event) => {
// 从事件中解构出action和payload
const { action, payload } = event.data;
// 如果action是'move',则解决(resolve)这个promise
if (action === 'move') {
resolve(payload);
}
};
})
};
// `end` 函数,异步结束游戏
export const end = async () => {
// 返回一个新的Promise对象
return new Promise((resolve, reject) => {
// 向worker发送结束游戏的消息
worker.postMessage({
action: 'end',
});
// 当worker发送消息回来时触发
worker.onmessage = (event) => {
// 从事件中解构出action和payload
const { action, payload } = event.data;
// 如果action是'end',则解决(resolve)这个promise
if (action === 'end') {
resolve(payload);
}
};
})
};
// `undo` 函数,异步执行撤销上一步操作
export const undo = async () => {
// 返回一个新的Promise对象
return new Promise((resolve, reject) => {
// 向worker发送撤销上一步操作的消息
worker.postMessage({
action: 'undo',
});
// 当worker发送消息回来时触发
worker.onmessage = (event) => {
// 打印接收到的撤销操作相关的信息
console.log('undo', event);
// 从事件中解构出action和payload
const { action, payload } = event.data;
// 如果action是'undo',则解决(resolve)这个promise
if (action === 'undo') {
resolve(payload);
}
};
})
};