Hỏi về bất đồng bộ trong nodejs



  • Mọi ng cho t hỏi, t đang viết nodejs express kết nối với database mongodb. cấu trúc của nó kiểu như thế này:
    0_1508811112222_Capture.JPG
    nhưng js bị dính bất đồng bộ nên cái output k bao giờ đc đủ x, y ,z. Ae cho ý kiến trong trường hợp này xử lý thế nào để query đc hết rồi mới đưa ra res. Tks.



  • Bạn có thể sử dụng 1 số thư viện như: async - caolan ...
    Hoặc nếu biết Promise thì có thể dụng Promise.all()



  • tks. cho mình hỏi thêm là so với callback thì sử dụng asyn await hay promise có ưu điểm gì hơn ngoài việc tránh callback hell (code khó nhìn, khó sửa).



  • ES7 hỗ trợ async/await nhằm xử lý mấy vụ này . Trước đó ES6 là promise
    Sử dụng async/await giúp code gọn đi rất nhiều .
    async function main() {
    await todos()
    // todos2 () ... more
    }



  • làm vầy cho nó lành

    db.collection('col1').findOne(query1,function(err,result){
        console.log(result);
        db.collection('col2').findOne(query2,function(err,result){
            console.log(result);    
            db.collection('col3').findOne(query3,function(err,result){
                console.log(result);    
            })        
        })        
    })
    


  • @Thuc-Nguyen-tan Ban đầu mình cũng làm thế này @@



  • Code thế nào thì tùy phong cách mỗi người.
    Code cho mình hiểu 1 kiểu
    Code cho mọi người hiểu 1 kiểu
    Code cho dễ nâng cấp bảo dưỡng bảo trì 1 kiểu

    Mọi người nên tham khảo các dự án lớn được public để rút kinh nghiêm
    Định nghĩa "dự án lớn" thì các bạn google nhé ;)



  • @GReaper

    bi giờ thì làm thế nào? có phải return không?



  • 
        var list_user=[];
        Owner
        .sync({force:true})
        .then(function(){ return Owner.create({name:'thuc101',role:'admin'}); })
        .then(function(u){ list_user.push(u);  return Owner.create({name:'thuc102',role:'editor1'}); })
        .then(function(u){ list_user.push(u); return Owner.create({name:'thuc103',role:'editor2'}); })
        .then(function(u){
            list_user.push(u);
            console.log(list_user);
            Owner.findAll()
            .then(function(ds){
                var data = { ds: ds }
                res.render('sequenlize_re/uuid2', data);
            })
        })
    
    
    

    Mình nghĩ trong monggo cũng có thế viết vậy .
    then 1 đẩy kết quả vào then 2
    then 2 đẩy kết quả vào then 3
    .......
    list sẽ hứng trọn tất cả.
    any idea?



  • Bạn dùng Promiss.All sẽ resolve được trường hợp này

    var p1 = new Promise((resolve, reject) => { 
      setTimeout(resolve, 1000, "one"); 
    }); 
    var p2 = new Promise((resolve, reject) => { 
      setTimeout(resolve, 2000, "two"); 
    });
    var p3 = new Promise((resolve, reject) => {
      setTimeout(resolve, 3000, "three");
    });
    
    Promise.all([p1, p2, p3]).then(function(values) => { 
      console.log(values); //Kết quả: values = ["one", "two", "three"]
      res.send(values) // Xử lý Response ở đây
    }, function(error) {
      console.log(error);
      res.send(error);
    });
    

    Tham khảo thêm Promiss.All tại đây nhé
    https://developer.mozilla.org/vi/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

    NHAN NGUYEN

    0

Log in to reply