Някои езици предоставят специална езикова конструкция за справяне с този проблем. Например C# има async
/await
ключови думи, които ви позволяват да пишете кода, сякаш извиквате синхронни API.
JavaScript не го прави и трябва да свържете createAccount
обаждания с обратни повиквания.
Някои хора са разработили библиотеки, които могат да ви помогнат да организирате този код. Например async , стъпка , node-promise и Q
Можете също да използвате влакна библиотека, собствена библиотека, която разширява времето за изпълнение на JavaScript с влакна / съпрограми.
И някои хора са разширили езика с конструкции, които са подобни на async
/await
:streamline.js
, IcedCoffeeScript
или wind.js
. Например streamline.js (аз съм авторът, така че очевидно съм предубеден) използва _
като специален контейнер за обратно извикване и ви позволява да напишете своя пример като:
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.")
}
}
И не на последно място, нови езикови функции като генератори и отложени функции се обсъждат за бъдещи версии на JavaScript (генераторите е много вероятно да кацнат в ES6, отложените функции изглежда са малко в застой).
Така че имате много възможности:
- придържайте се към обратните повиквания
- използване на помощна библиотека
- използвайте разширението за изпълнение на fibre
- използвайте езиково разширение
- изчакайте ES6