Saya telah melihat kode yang terlihat seperti:
myObj.doSome("task").then(function(env) {
// logic
});
Dari mana datangnya then()
?
javascript
Kay Pale
sumber
sumber
Jawaban:
Cara tradisional untuk menangani panggilan asinkron dalam JavaScript adalah dengan panggilan balik. Katakanlah kita harus melakukan tiga panggilan ke server, satu demi satu, untuk mengatur aplikasi kita. Dengan panggilan balik, kode tersebut mungkin terlihat seperti berikut (dengan asumsi fungsi xhrGET untuk melakukan panggilan server):
Dalam contoh ini, pertama-tama kita mengambil konfigurasi server. Kemudian berdasarkan itu, kami mengambil informasi tentang pengguna saat ini, dan akhirnya mendapatkan daftar item untuk pengguna saat ini. Setiap panggilan xhrGET mengambil fungsi panggilan balik yang dieksekusi ketika server merespons.
Sekarang tentu saja semakin banyak level sarang yang kita miliki, semakin sulit kodenya untuk membaca, men-debug, memelihara, meningkatkan, dan pada dasarnya bekerja dengannya. Ini umumnya dikenal sebagai neraka panggilan balik. Juga, jika kita perlu menangani kesalahan, kita mungkin perlu meneruskan fungsi lain untuk setiap panggilan xhrGET untuk memberi tahu apa yang perlu dilakukan jika terjadi kesalahan. Jika kita ingin memiliki satu penangan kesalahan yang umum, itu tidak mungkin.
API Janji mengusulkan yang berikut:
promise
objek.promise
objek akan memilikithen
fungsi yang dapat mengambil dua argumen,success
pawang danerror
pawang.then
fungsi akan dipanggil hanya sekali , setelah tugas asinkron selesai.then
Fungsi juga akan mengembalikanpromise
, untuk memungkinkan chaining beberapa panggilan.value
, yang akan diteruskan ke fungsi berikutnya sebagaiargument
, dalam rantaipromise
s.promise
(membuat permintaan asinkron lain), maka pawang berikutnya (sukses atau kesalahan) akan dipanggil hanya setelah permintaan itu selesai.Jadi kode contoh sebelumnya mungkin diterjemahkan menjadi sesuatu seperti yang berikut, menggunakan janji dan
$http
layanan (dalam AngularJs):Menyebarkan Keberhasilan dan Kesalahan
Chaining menjanjikan adalah teknik yang sangat kuat yang memungkinkan kita untuk menyelesaikan banyak fungsi, seperti memiliki layanan melakukan panggilan server, melakukan beberapa postprocessing data, dan kemudian mengembalikan data yang diproses ke controller. Tetapi ketika kita bekerja dengan
promise
rantai, ada beberapa hal yang perlu kita ingat.Pertimbangkan
promise
rantai hipotetis berikut dengan tiga janji, P1, P2, dan P3. Masing-masingpromise
memiliki penangan sukses dan penangan kesalahan, jadi S1 dan E1 untuk P1, S2 dan E2 untuk P2, dan S3 dan E3 untuk P3:Dalam aliran hal-hal normal, di mana tidak ada kesalahan, aplikasi akan mengalir melalui S1, S2, dan akhirnya, S3. Namun dalam kehidupan nyata, segalanya tidak pernah semulus itu. P1 mungkin mengalami kesalahan, atau P2 mungkin mengalami kesalahan, memicu E1 atau E2.
Pertimbangkan kasus-kasus berikut:
• Kami menerima respons yang berhasil dari server di P1, tetapi data yang dikembalikan tidak benar, atau tidak ada data yang tersedia di server (pikirkan array kosong). Dalam kasus seperti itu, untuk P2 janji berikutnya, itu harus memicu penangan kesalahan E2.
• Kami menerima kesalahan untuk P2 janji, memicu E2. Tetapi di dalam handler, kami memiliki data dari cache, memastikan bahwa aplikasi dapat memuat seperti biasa. Dalam hal ini, kami mungkin ingin memastikan bahwa setelah E2, S3 dipanggil.
Jadi setiap kali kita menulis sukses atau penangan kesalahan, kita perlu menelepon — mengingat fungsi kita saat ini, apakah janji ini berhasil atau gagal bagi penangan berikutnya dalam rantai janji?
Jika kita ingin memicu penangan sukses untuk janji berikutnya dalam rantai, kita bisa mengembalikan nilai dari keberhasilan atau penangan kesalahan
Jika, di sisi lain, kami ingin memicu penangan kesalahan untuk janji berikutnya dalam rantai, kita bisa melakukannya menggunakan
deferred
objek dan memanggilreject()
metodeObjek yang ditangguhkan di Jquery: https://api.jquery.com/jquery.deferred/
Objek yang ditangguhkan di AngularJs: https://docs.angularjs.org/api/ng/service/ $ q
sumber
kemudian () fungsi terkait dengan "janji Javascript" yang digunakan di beberapa perpustakaan atau kerangka kerja seperti jQuery atau AngularJS.
Janji adalah pola untuk menangani operasi asinkron. Janji itu memungkinkan Anda untuk memanggil metode yang disebut "lalu" yang memungkinkan Anda menentukan fungsi yang akan digunakan sebagai panggilan balik.
Untuk informasi lebih lanjut, lihat: http://wildermuth.com/2013/8/3/JavaScript_Promises
Dan untuk janji-janji Angular: http://liamkaufman.com/blog/2013/09/09/using-angularjs-promises/
sumber
A promise can only succeed or fail once
, danIf a promise has succeeded or failed and you later add a success/failure callback, the correct callback will be called
promise
dan apa yang akan dilakukan dengancallback
Setahu saya, tidak ada
then()
metode built-in dijavascript
(pada saat penulisan ini).Tampaknya apa pun yang
doSome("task")
dikembalikan memiliki metode yang disebutthen
.Jika Anda mencatat hasil pengembalian
doSome()
ke konsol, Anda harus dapat melihat properti dari apa yang dikembalikan.UPDATE (Pada ECMAScript6) : -
The
.then()
Fungsi telah dimasukkan ke javascript murni.Dari dokumentasi Mozilla di sini ,
Objek Janji, pada gilirannya, didefinisikan sebagai
Artinya,
Promise
bertindak sebagai pengganti untuk nilai yang belum dihitung, tetapi harus diselesaikan di masa depan. Dan.then()
fungsi tersebut digunakan untuk mengaitkan fungsi yang akan dipanggil pada Janji ketika itu diselesaikan - baik sebagai keberhasilan atau kegagalan.sumber
.then
saat itu, tetapi janji-janji asli datang sekarang di ES6: html5rocks.com/en/tutorials/es6/promisesIni adalah sesuatu yang saya buat untuk diri saya sendiri untuk menjernihkan cara kerja. Saya kira orang lain juga dapat menemukan contoh konkret ini berguna:
sumber
Ini JS_Fiddle kecil .
kemudian adalah metode callback stack yang tersedia setelah janji diselesaikan itu adalah bagian dari perpustakaan seperti jQuery tetapi sekarang tersedia dalam JavaScript asli dan di bawah ini adalah penjelasan detail cara kerjanya
Anda dapat melakukan Janji dalam JavaScript asli: sama seperti ada janji di jQuery, Setiap janji dapat ditumpuk dan kemudian dapat dipanggil dengan Putuskan dan Tolak panggilan balik, Ini adalah bagaimana Anda dapat membuat panggilan panggilan tidak sinkron.
Saya bercabang dan Diedit dari MSDN Documents pada status pengisian daya baterai ..
Apa yang dilakukan adalah mencoba mencari tahu apakah pengguna laptop atau perangkat sedang mengisi baterai. kemudian dipanggil dan Anda dapat melakukan pos pekerjaan Anda sukses.
Contoh es6 lainnya
sumber
then
asalnya dan bagaimana cara kerjanya. Anda harus meningkatkan jawaban Anda untuk memberikan perincian itu.Saya menduga doSome mengembalikan ini, yang merupakan myObj, yang juga memiliki metode kemudian. Rantai metode standar ...
Jika doSome tidak mengembalikan ini, menjadi objek yang doSome dieksekusi, yakinlah itu mengembalikan beberapa objek dengan metode kemudian ...
sebagai @patrick menunjukkan, tidak ada maka () untuk js standar
sumber
doSome ("task") harus mengembalikan objek janji, dan janji itu selalu memiliki fungsi. Jadi kode Anda sama seperti ini
dan Anda tahu ini hanyalah panggilan biasa ke fungsi anggota.
sumber
.then
mengembalikan janji dalam fungsi async.Contoh yang bagus adalah:
Untuk menambahkan logika lain ke dalamnya, Anda juga dapat menambahkan fungsi
reject('I am the rejected param')
panggilan dan console.log itu.sumber
Dalam hal ini
then()
adalah metode kelas dari objek yang dikembalikan olehdoSome()
metode.sumber
Fungsi ".then ()" adalah wideley yang digunakan untuk objek yang dijanjikan dalam pemrograman Asynchoronus Untuk Windows 8 Store Apps. Sejauh yang saya mengerti itu berfungsi beberapa cara seperti panggilan balik.
Temukan Detail di Documentantion ini http://msdn.microsoft.com/en-us/library/windows/apps/hh700330.aspx
Sebab itu bisa juga nama untuk fungsi yang didefinisikan lainnya.
sumber
Contoh lain:
Logika yang sama menggunakan fungsi panah singkatan:
sumber
Saya terlambat sekitar 8 tahun, well ... Bagaimanapun, saya tidak benar-benar tahu apa yang kemudian () lakukan tetapi mungkin MDN mungkin punya jawaban. Sebenarnya, saya mungkin lebih memahaminya.
Ini akan menunjukkan kepada Anda semua informasi (mudah-mudahan), yang Anda butuhkan. Kecuali seseorang telah memposting tautan ini. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
Formatnya adalah prom.prototype.then () Janji dan prototipe adalah sejenis variabel tetapi tidak seperti variabel dalam javascript, maksud saya seperti hal-hal lain pergi ke sana seperti navigator.getBattery (). Lalu () di mana ini sebenarnya ada tetapi jarang digunakan di web, yang ini menunjukkan status tentang baterai perangkat, informasi lebih lanjut dan lebih banyak tentang MDN jika Anda penasaran.
sumber