Я тоже был в замешательстве. Примеры Большинство Node.js сделать это похоже write()
синхронно:
var server = net.createServer(function(socket) {
socket.write('Hello!');
socket.end();
});
Оказывается версию без обратного вызова write()
фактически означает write_eventually()
. Если он не может фактически записать ваши данные в сокет, он приостанавливает его в памяти. Узел заботится о том, чтобы в конечном итоге записать в очередь данные в очередь.
Я предполагаю, что они сделали это, потому что обратные вызовы раздражают, и это уменьшает количество обратных вызовов в вашем коде. Недостатком является то, что он использует больше памяти (см .: Socket.bufferSize
).
Если Вы выдвигаете много данных, это более эффективно использует память, чтобы использовать версию обратного вызова write()
:
"use strict";
var net = require("net")
function writeArray(arrayOfChunks, socket, callback) {
var i = 0;
function f() {
if (i >= arrayOfChunks.length) {
callback();
} else {
socket.write(arrayOfChunks[i++], null, f);
}
}
f()
}
var server = net.createServer((socket) => {
var arrayOfChunks = ['Hello', ', ', 'world!', '\n'];
writeArray(arrayOfChunks, socket,() => {
socket.write('DONE\n', null,() => {
socket.end();
})
})
})
server.listen(9191,() => {
console.log("Server listening.");
})
Но 2016, так что, может быть, вы можете просто использовать async
/await
и не должны иметь дело с обратным вызовом/обещанием ерунды.
Если «async» означает «он блокирует ввод-вывод», тогда да, блок «for» блокирует выполнение. Найдите в асинхронной библиотеке, например https://github.com/caolan/async, работу с массивом. – srquinn
Вопрос не в том, что о погоде 'for' цикл цикла (они этого не делают). это значит, что 'Socket.write()' блокирует последующие записи в один и тот же сокет. я бы предположил, что у него есть способ сделать это, поскольку вы не можете одновременно записывать в один сокет несколько пакетов. – leeoniya
'for' петли абсолютно блокируют DO. Выполнение скрипта не продолжается до тех пор, пока цикл for не закончится и, следовательно, свяжет поток. – srquinn