我是JS的新手,我的日常工作是PHP,所以我决定做一个简单的MUD Telnet游戏来练习我的JS技能。
其想法是使用异步/等待来完成乍一看似乎是同步的Telnet服务器代码。我用"babel-node app.js“运行这段代码。
'use strict';
let Promise = require('bluebird');
let net = Promise.promisifyAll(require('net'));
// Async code ahead...
(async () => {
// Get me some server.
let server = net.createServer();
// On new connection.
server.on('connection', async (socket) => {
// Set socket (stream) encoding on utf8.
socket.setEncoding('utf8');
// Say hello to the client.
socket.write('hello\r\n');
socket.write('waiting for input... ');
// Await input from client
let input = await new Promise((resolve, reject) => {
socket.on('data', resolve);
});
socket.write('input received: ' + input);
console.log('input received: ' + input)
});
await server.listenAsync(1234);
console.log('server is ready for connections');
})();发布于 2016-12-21 21:42:35
除了以下几点之外,我没有发现代码有什么问题:
// Await input from client
let input = await new Promise((resolve, reject) => {
socket.on('data', resolve);
}); 根据客户端发送数据的频率,data事件可以多次触发。然而,一个承诺可以被认为是一次性事件发射器.一旦它被解决了,它就会被解决。因此,即使数据事件再次触发,也不会发生任何事情。
这也意味着异步connection事件处理程序没有任何意义,所以这就使大部分代码变成了传统的回调-y节点脚本。
对于“返回”的一次性异步操作(如网络请求、fs操作等),异步/等待是有意义的。不说异步/等待是无用的。对于异步来说,这只是一个糟糕的例子,因为操作需要事件发射器,而不是承诺。
https://codereview.stackexchange.com/questions/150421
复制相似问题