如何在JS中用async/await实现命令模式



我目前正在实现WebSocket连接,并使用命令模式方法根据用户执行的命令发出一些消息。

这是我实现的抽象:

let socketInstance;
const globalName = 'ws'
const globalObject = window[globalName];
const commandsQueue = isArray(globalObject.q) ? globalObject.q : [];
globalObject.q = {
push: executeCommand
};
commandsQueue.forEach(command => {
executeCommand(command);
});
function executeCommand(params) {
const actions = {
create,
send
};
const [command, ...arg] = params;
if (actions[command]) {
actions[command](arg);
}
}
function send([message]) {
socketInstance.send(message);
}
function create([url]) {
socketInstance = new WebSocket(url);
}

为了开始发送消息,用户应该运行:

window.ws.push('create', 'ws://url:port');
window.ws.push('send', 'This is a message');

我遇到的问题是连接是异步的,我需要等到连接完成后才能继续执行下一个命令。在commandsQueue.forEach中实现异步/等待是个好主意,还是迭代器是更好的方法?你还推荐其他哪些最佳方法?

我现在使用的解决方案是:我在开始时创建了一个空的消息数组,然后每次调用send命令时,我都会验证连接是否未打开,并将其添加到此数组中。

类似的东西:

const messages = [];
let socketInstance;
let isConnectionOpen = false;
const globalName = "ws";
const globalObject = window[globalName];
const commandsQueue = isArray(globalObject.q) ? globalObject.q : [];
globalObject.q = {
push: executeCommand,
};
commandsQueue.forEach((command) => {
executeCommand(command);
});
function executeCommand(params) {
const actions = {
create,
send,
};
const [command, ...arg] = params;
if (actions[command]) {
actions[command](arg);
}
}
function send([message]) {
if (isConnectionOpen) {
socketInstance.send(message);
} else {
messages.push(message);
}
}
function onOpen() {
isConnectionOpen = true;
messages.forEach((m) => {
send([m]);
});
messages.length = 0;
}
function create([url]) {
socketInstance = new WebSocket(url);
socketInstance.onopen = onOpen;
}

最新更新