我正在用socket api写一个 Chrome 扩展(虽然这个文档已经过时了,最新版本的 api 在这里),我发现代码真的很难组织:
所有方法都在 namespace 下,为了简单起见chrome.experimental.socket
,我将在socket
下面使用。
socket.create("tcp", {}, function(socketInfo){
var socketId = socketInfo.socketId;
socket.connect(socketId, IP, PORT, function(result){
if(!result) throw "Connect Error";
socket.write(socketId, data, function(writeInfo){
if(writeInfo.bytesWritten < 0) throw "Send Data Error";
socket.read(socketId, function(readInfo){
if(readInfo.resultCode < 0) throw "Read Error";
var data = readInfo.data; // play with the data
// then send the next request
socket.write(socketId, data, function(writeInfo){
socket.read(socketId, function(readInfo){
// ............
});
});
});
})
});
})
因为socket.write
和socket.read
都是异步的,所以我必须嵌套回调以确保在上一个请求得到正确响应之后发送下一个请求。
管理这些嵌套函数真的很难,我该如何改进呢?
更新
我想要一个send
可以用作的方法:
send(socketId, data, function(response){
// play with response
});
// block here until the previous send get the response
send(socketId, data, function(response){
// play with response
});