Niektóre języki zapewniają specjalną konstrukcję językową, która radzi sobie z tym problemem. Na przykład C# ma async
/await
słowa kluczowe, które pozwalają napisać kod tak, jakbyś wywoływał synchroniczne interfejsy API.
JavaScript nie działa i musisz połączyć createAccount
połączenia z oddzwonieniami.
Niektórzy opracowali biblioteki, które mogą pomóc w zorganizowaniu tego kodu. Na przykład async , krok , node-promise i P
Możesz także użyć włókien biblioteka, natywna biblioteka, która rozszerza środowisko wykonawcze JavaScript o włókna / współprogramy.
Niektórzy rozszerzyli język o konstrukcje podobne do async
/await
:streamline.js
, IcedCoffeeScript
lub wind.js
. Na przykład streamline.js (jestem autorem, więc jestem oczywiście stronniczy) używa _
jako specjalny symbol zastępczy wywołania zwrotnego i pozwala napisać przykład jako:
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.")
}
}
I wreszcie nowe funkcje językowe, takie jak generatory i funkcje odroczone są dyskutowane dla przyszłych wersji JavaScript (generatory najprawdopodobniej wylądują w ES6, odroczone funkcje wydają się nieco utknęły w martwym punkcie).
Masz więc wiele opcji:
- trzymaj się wywołań zwrotnych
- użyj biblioteki pomocniczej
- użyj rozszerzenia runtime fiber
- użyj rozszerzenia językowego
- czekaj na ES6