2015-12-05 203 views
1

這些代碼有什麼區別?瞭解節點中的非阻塞IO

***首先*

var express = require('express'); 
var app = express(); 

app.post('/', function (req, res) { 

    console.log('Procesando abastecimiento...'); 

    var rawData = ''; 

    req.on('data', function (chunk) { 
     rawData += chunk; 
    }); 

    req.on('end', function(){ 
     console.log('Data recibida: ' + rawData); 
     res.end(); 
    });  
}); 

var express = require('express'); 
var app = express(); 

app.post('/', function (req, res) { 

    console.log('Procesando abastecimiento...'); 

    var rawData = ''; 

    req.on('data', function (chunk) { 
     rawData += chunk; 
    }); 

    req.on('end', function(){ 
     console.log('Data recibida: ' + rawData);  
    }); 

    res.end(); 
}); 

如果我關閉 '結束' 事件的回調內部的連接(res.end()),將在客戶端等待,直到所有數據被讀取?我不明白區別,我只是知道我的代碼使用第二種方式更快。你能解釋我爲什麼嗎?

+0

如果您在外部調用res.end,則立即在請求發出後立即調用它。你應該使用第一個代碼而不是第二個代碼。 –

回答

1

在第一個示例中,您設置要執行的res.end();指令end回調(即引發end事件)。

在第二個中,您立即致電res.end();而無需等待結束請求。

你可以認爲它好像指令req.on('end', ...)是爲將來會發生的事件設置處理程序的函數,但是直到收到事件纔會執行該代碼。