So sánh async module và promise!



  • Chào mọi người!
    Điểm mạnh của nodejs là bất đồng bộ, nhưng trong nhiều trường hợp mình muốn control nó để giải quyết đúng bài toán của mình. Ví dụ, mình muốn insert đơn hàng xong rồi mới insert chi tiết đơn hàng, vì chi tiết đơn hàng cần id của đơn hàng. Nếu viết theo cách thông thường, callback lồng callback thì sẽ chạy sai. Để giải quyết nó thì mình dùng async.waterfall hoặc promise. Vậy 2 cách này có ưu nhược điểm gì và dùng cái nào tốt hơn?
    Nhân tiện ai đã từng làm sâu về module async thì cho mình xin tài liệu hoặc kinh nghiệm với, tìm trên mạng chỉ nói chung chung là async của nodejs thôi, rất ít tài liệu nói về module này (hoặc do mình tìm chưa ra).
    Rất mong được mọi người chỉ giáo. Thanks!


  • Global Moderator

    @Celinto Với một vài tình huống, ngữ cảnh phức tạp thì async kiểm soát tốt hơn. Có các Control Flow cực mạnh mẽ! Ngược lại, thì Promise thân thiện và có cú pháp đơn giản hơn. Thêm nữa async hoạt động ở mức độ thấp hơn lower level so với Promise.

    Nên cũng tùy tình huống và sở thích của bạn mà sử dụng. Tài liệu về async thì bạn tham khảo ở đây: caolan.github.io/async

    Tech-nông
    Twitter: @nhubaovu
    Profile: about.me/vunb

    0


  • Thanks @Vũ , trang web bạn đưa mình cũng có tham khảo, nhưng nó chỉ define function của async thôi, chứ k phân tích sâu, cái này chắc ai làm nhiều thì có kinh nghiệm :). Đúng là nó có rất nhiều method về Control Flow cho mình lựa chọn, nhưng theo bạn nói những tình huống phức tạp thì async làm tốt hơn Promise, bạn có thể cho mình 1 ví dụ cụ thể được không? Vì mình cũng đang muốn tìm hiểu chỗ này



  • Mình vừa tìm được blog nói về điểm mạnh của promise so với async, mọi người tham khảo rồi cùng thảo luận tiếp nha:
    https://spion.github.io/posts/why-i-am-switching-to-promises.html



  • Đúng là cũng tùy trường hợp.
    Mình không biết diễn tả thế nào nên lấy ví dụ khi sử dụng async:
    Ví dụ: Khi query database với nhiều query:

    async.parallel([
    function(cb){ mysql.query(sql1, cb) },
    function(cb){ mysql.query(sql2, cb) },
    function(cb){ redis.hget(key, cb) }
    ], function(err, rows){
    console.log(rows)
    });

    Cái này nếu dùng Promise chắc mệt lắm.


Log in to reply