Những điều cần biết về Async/Await
Chào mọi người, chúng ta lại gặp nhau trong series Javascipt.
Hôm nay, chúng ta sẽ cùng tìm hiều về async await, cặp bài trùng giúp Promise hoàn hảo hơn.
Oke, Let's go :
I. Async / Await là gì?
Async / Await là một tính năng của JavaScript:
+) Giúp chúng ta làm việc dễ dàng hơn với các hàm bất đồng bộ.
+) Được xây dựng trên Promises và có thể sử dụng với tất cả các Promise .
Async - khai báo một hàm bất đồng bộ
Tự động biến đổi một hàm thông thường thành một Promise.
Khi gọi tới hàm async nó sẽ xử lý mọi thứ và được trả về kết quả trong hàm của nó.
Async cho phép sử dụng Await.
Await - tạm dừng việc thực hiện các hàm Async
Khi được đặt trước một Promise, nó sẽ đợi cho đến khi Promise kết thúc và trả về kết quả.
Await chỉ làm việc với Promises, nó không hoạt động với callbacks.
Await chỉ có thể được sử dụng bên trong các hàm async.
Chúng ta cùng xem qua ví dụ sau:
async function func1() {
console.log(1);
var a = await 2;
console.log(a);
}
func1();
console.log(3);
Kết quả:
1
3
2
Oke, giải thích một chút nha:
Chúng ta có thể thấy hàm func1 được gọi và thực hiện trước câu lệnh console.log(3).
Vậy câu lệnh đầu tiên được thực hiện là console.log(1).
Chương trình chạy tiếp và gặp dòng lệnh await. Nó tạm dừng việc thực hiện hàm func1.
Vậy câu lệnh thứ 2 được thực hiện là console.log(3).
Sau khi các dòng lệnh đồng bộ đã được thực hiện hết (những câu lệnh thông thường như console.log(3)). Chương trình sẽ thực hiện đến những câu lệnh sau await (câu lệnh chờ).
Vậy câu lệnh thứ 3 được thực hiện là console.log(2).
Và chúng ta được kết quả như trên .
II. Xử lý lỗi trong Async / Await
Ta cùng xem ví dụ sau:
async function func1() {
try {
var ketqua = await logicFunction();
console.log(ketqua);
} catch (error) {
// lỗi của hàm logicFunction(nếu có) sẽ được in ra ở đây
console.log(error);
}
}
func1();
Nếu muốn bắt lỗi khi đang sử dụng async await, chỉ đơn giản , chúng ta sẽ cho chúng vào trong khối try/catch.
Mệnh đề catch sẽ xử lý các lỗi gây ra bởi các hàm bất đồng bộ hoặc bất kỳ lỗi nào chúng ta có thể đã viết bên trong khối try.
Lưu ý: Và vì các hàm async đều trả về Promises, nên chúng ta có thể bắt lỗi giống như một Promise bình thường. Như sau:
async function func1() {
var ketqua = await logicFunction();
console.log(ketqua);
}
func1()
.then(success)
.catch(error);
III. TỔNG KẾT
Vậy là chúng ta đã cùng nhau tìm hiểu về Async/Await.
Với việc xuất hiện của Async/Await từ ES7 (hiểu nôm na là những phiên bản của ngôn ngữ: ECMAScript), thì việc xử lý với các hàm bất đồng bộ đã được giải quyết khá triệt để.
Chúc các bạn thật thành thạo với Async/Await nha!!
Nếu có phản hồi gì, hãy để lại bình luận phía dưới để chúng mình bổ sung và hoàn thiện hơn nữa trong những bài viết tiếp theo nha!!!
Xin chào và hẹn gặp lại!!!
Get repository này về,
https://github.com/trankyhoathanh/example-nodejs-mongodb
đăng ký 1 account mongodb, thay đổi connectionstring (nhớ chỉnh IP allowed anything)
Run dưới localhost ok => deploy lên server của bạn.
@Nguyễn-Trung-Đức Bạn nói máy bị full disk mà không ghi rõ dung lượng ổ cứng bao nhiêu. Thông thường là do log file của database hoặc của app. Bạn xem log file chiếm bao nhiêu rồi.
Xin chào mọi người,
E đang có chút vướng mắc trong quá trình dùng package raix:push để gửi notification đến app android và ios, e đang tập trung trên Android trước. Các vấn đề gặp phải.
Nếu e bật app lên và gửi notification thì nó ko hiện gì. Nếu mình dùng push.addlistener để lắng nghe massage sau đó dùng alert ra thì có thể nhận biết được nhưng là cách cùi :))) cũng có thể mình ko hiểu về FCM lắm, nên là bác nào biết về FCM chỉ bảo e với.
Là khi tắt app đi thì gửi và đã nhận được, nhưng nó chỉ hiện icon trên status bar của Android, e phải vuốt xuống thì nó mới hiện ra. E muốn nó đẩy ra ngoài như fb ý có làm được bằng config của package ko ạ. Hay phải dùng cách khác.
Em ko gửi được notification từ trên browser cho browser dc ạ. Mà phải dùng gói khác để gửi. Mặc dù gói này có hỗ trợ gửi trên browser @@ nhưng e ko tìm được config.
Nếu package này ko hay lắm thì các bác biết package khác để gửi notification cho cả app Android, IOS, browser ko ạ.
Em cảm ơn!
Nếu bạn có quyền kiểm soát project (settings, configuration ...) thì nên dùng await/async. Code sẽ rõ hơn và sẽ giống như synchronous programming style hơn
@tranthanh xin lỗi bạn, mình dùng Nodejs là ngôn ngữ phụ nên ko có tài liệu hay biết trang hd nào cả. Cần tìm module phù hợp thì mình tìm ở Github, npmjs.com và nodejs.org.
Có vẻ như bạn mới tiếp xúc nodejs , bạn nên vào Udemy xem có khóa học nào không.
Đú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.
@kevin3489 Mình đang làm phần change password mà phải kiểm tra pass cũ có đúng không thì làm sao bạn? mình có sữ dụng bcrypt nhưng mà không biết kiểu mã hóa của thằng setPassword() là kiểu gì nên bỏ chuỗi hash của mình trong db vô bcrypt compare thì nó báo sai kiểu hash..
@Nguyễn-Hải-Linh
em cung moi tim hieu ve nodejs day la email cua em : [email protected] nho anh gui cho em may cuon hoc nodejs co ban de em luyen tap them.
em cam on anh truoc!
@kenguyen đã nói trong Nên sử dụng template engine nào cho ứng dụng NodeJS (ExpressJS)?:
@Vũ Em có thắc mắc là khi dùng Angular thì code mình viết client có thể thấy được như vậy làm sao để bảo mật ứng dụng hả anh? Em đang quan tâm và tìm hiểu để xây dựng ứng dụng MEAN Stack ạ.
Như câu hỏi của @kenguyen thì không đáng ngại lắm, muốn giấu code thì có thể làm giống với cách của @name-no
Nói thêm về bảo mật mình không thể nhanh chóng được, cần có cả chính sách bảo mật và giải pháp kỹ thuật cụ thể. Việc làm đầu tiên là liệt kê được phạm vi các công việc cần thực hiện. Sau đó thực thi các giải pháp cụ thể, tùy vào sản phẩm và công nghệ.
Bạn có thể tham khảo checklist bảo mật này mà mình đã tổng hợp tại đây: Tổng hợp 11 biện pháp bảo mật về lập trình an toàn trong phát triển ứng dụng Web.
Còn về việc Minify mã nguồn ở phía client có lợi ích lớn là tăng tốc độ của ứng dụng, chống copy một cách phũ phàng :))) Cái này ưu tiên sau cũng được, vì còn nhiều thứ đáng quan tâm hơn.
@jokyspy .. Anh ơi cho em hỏi... tại sao em đọc 1 số code cũng như code của anh em thấy moi người đều lưu trữ session trong database, hay như trong code mình tạo 1 store và tạo mới 1 mongoStore ... anh có thể giải thích rõ hơn 1 chút về phần lưu trữ này được không ạ !
có bạn nào đã dùng qua module passport-ldapauth chưa ? tại vì yêu cầu của bên mình phải nghiên cứu xem passport có hỗ trợ giao thức xác thực này hay không