Thắc mắc callback mong được giải đáp.



  • Chào các bác. Em có 2 block code sau:

    //blocking.js
    var fs = require('fs');
    var data = fs.readFileSync('input.txt');
    console.log(data.toString());
    console.log('Program Ended');
    
    //non-blocking.js
    var fs = require('fs');
    
    fs.readFile('input.txt', function(err, data){
    	if(err) 
    		return console.err(err);
    	else
    		console.log(data.toString());
    });
    console.log('Program Ended');
    

    Ở khối code đầu thì em hiểu nó xử lý theo trình tự và kết quả của nó là xuất nội dung file sau đó mới xuất dòng 'Program Ended'. Nhưng ở code thứ 2, em ko hiểu tại sao nó lại xuất cái dòng 'Program End' trước tiên. Theo em nghĩ thì hàm callback nó cũng xử lý theo trình tự chứ vì code của nó so với đoạn đầu cũng là sắp xếp trình tự mà



  • @thangtv611 chắc bạn mới chuyển từ ngôn ngữ gì sang nodejs phải không :D
    Nodejs nó là thế nhé, đoạn 2 nó là "không đồng bộ” nên dòng console.log() cuối và đoạn callback chạy ko đồng bộ với nhau, ai xong trc thì ra kết quả trước



  • @Super-Dick phạm vi không đồng bộ bao gồm cả chương trình luôn hả bác? :)



  • Callback function có thể hiểu tạm là chia việc ra làm;
    Đoạn code trên trao nhiệm vụ cho readFile đọc nội dung file input.txt, với ghi chú là: khi chú đọc nội dung xong nhớ chạy function(err,data);
    Sau khi trao nhiệm vụ cho readFile như thế, code chính tiếp tục làm việc kế của nó là thi hành lệnh console.log mà không đợi readFile.

    Làm nhiều việc đồng thời vậy sẽ hiệu quả hơn. ReadFile trong máy thì nhanh, nhưng nếu bạn cần lấy file từ mạng xuống thì có thể sẽ đợi lâu. Bạn không muốn dừng tất cả công việc của mình ở đó mà đợi.



  • " xử lý theo trình tự" khác với "thứ tự của line code" nhé bác.



  • Hi @thangtv611

    Để bạn hiểu sâu hơn về cơ chế Asynchronous của Javascript và để giải thích cho bạn hiểu tường tận về cốt lõi vấn đề ở trên thì rất dong dài :). Để tiết kiệm thời gian cho đôi bên. Mình khuyên bạn nên dành chút thời gian đọc cái này. Asynchrony: Now & Later


Log in to reply