Beberapa bahasa menyediakan konstruksi bahasa khusus untuk mengatasi masalah ini. Misalnya, C# memiliki async
/await
kata kunci yang memungkinkan Anda menulis kode seolah-olah Anda memanggil API sinkron.
JavaScript tidak dan Anda harus membuat rantai createAccount
panggilan dengan panggilan balik.
Beberapa orang telah mengembangkan perpustakaan yang dapat membantu Anda mengatur kode ini. Misalnya async , langkah , node-promise dan T
Anda juga dapat menggunakan serat library, library native yang memperluas runtime JavaScript dengan fiber / coroutine.
Dan beberapa orang telah memperluas bahasa dengan konstruksi yang mirip dengan async
/await
:streamline.js
, IcedCoffeeScript
atau wind.js
. Misalnya, streamline.js (saya penulisnya jadi saya jelas bias) menggunakan _
sebagai placeholder panggilan balik khusus dan memungkinkan Anda menulis contoh sebagai:
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.")
}
}
Dan, yang tak kalah pentingnya, fitur bahasa baru seperti generator dan fungsi yang ditangguhkan sedang dibahas untuk versi JavaScript mendatang (generator kemungkinan besar akan mendarat di ES6, fungsi yang ditangguhkan tampaknya agak terhenti).
Jadi Anda memiliki banyak pilihan:
- tetap pada panggilan balik
- gunakan pustaka pembantu
- gunakan ekstensi waktu proses fiber
- gunakan ekstensi bahasa
- tunggu ES6