Một số ngôn ngữ cung cấp cấu trúc ngôn ngữ đặc biệt để giải quyết vấn đề này. Ví dụ:C # có async
/ await
từ khóa cho phép bạn viết mã như thể bạn đang gọi các API đồng bộ.
JavaScript thì không và bạn phải xâu chuỗi createAccount
cuộc gọi với các cuộc gọi lại.
Một số người đã phát triển các thư viện có thể giúp bạn sắp xếp mã này. Ví dụ: async , bước , nút hứa và Q
Bạn cũng có thể sử dụng sợi thư viện, một thư viện gốc mở rộng thời gian chạy JavaScript với các sợi / coroutines.
Và một số người đã mở rộng ngôn ngữ với các cấu trúc tương tự như async
/ await
: streamline.js
, IcedCoffeeScript
hoặc wind.js
. Ví dụ:streamline.js (tôi là tác giả nên rõ ràng tôi có thành kiến) sử dụng _
dưới dạng trình giữ chỗ gọi lại đặc biệt và cho phép bạn viết ví dụ của mình dưới dạng:
var db = MongoClient.connect("mongodb://localhost:27017/bq", _):
var accounts = db.createCollection('accounts', _);
createAccount("bob","bob", _);
createAccount("bob","bob", _);
createAccount("bob","bob", _);
createAccount("bob","bob", _);
function createAccount(email, password, _) {
var item = accounts.findOne({"email":email}, _);
if (item === null) {
accounts.insert({"email":email, "password":password}, _);
console.log("Account " + email + " created."); }
} else {
console.log("Account already exists.")
}
}
Và, cuối cùng nhưng không kém phần quan trọng, các tính năng ngôn ngữ mới như trình tạo và chức năng hoãn lại đang được thảo luận về các phiên bản JavaScript trong tương lai (các trình tạo rất có thể xuất hiện trong ES6, các chức năng bị trì hoãn có vẻ hơi bị đình trệ).
Vì vậy, bạn có nhiều lựa chọn:
- bám sát các lệnh gọi lại
- sử dụng thư viện trợ giúp
- sử dụng phần mở rộng thời gian chạy của sợi
- sử dụng tiện ích mở rộng ngôn ngữ
- đợi ES6