Tulis semula tajuk sebagai: Bagaimana untuk menukar API panggil balik sedia ada kepada borang Promise?
P粉268654873
2023-08-21 18:34:55
<p>Saya mahu menggunakan janji untuk mengendalikannya, tetapi format API panggil balik saya adalah seperti berikut: </p>
<h3>1. Pemuatan DOM atau acara sekali lagi: </h3>
<pre class="brush:php;toolbar:false;">window.onload;
...
window.onload = function() {
};</pre>
<h3>2. Fungsi panggil balik biasa: </h3>
<pre class="brush:php;toolbar:false;">permintaan fungsi(onChangeHandler) {
...
}
permintaan(fungsi() {
// berubah
...
});</pre>
<h3>3. Fungsi panggil balik gaya nod ("nodeback"): </h3>
<pre class="brush:php;toolbar:false;">function getStuff(dat, callback) {
...
}
getStuff("dataParam", fungsi(err, data) {
...
})</pre>
<h3>4. Keseluruhan pustaka menggunakan fungsi panggil balik gaya Nod: </h3>
<pre class="brush:php;toolbar:false;">API;
API.one(function(err, data) {
API.two(function(err, data2) {
API.tiga(fungsi(err, data3) {
...
});
});
});</pre>
<h3>Bagaimanakah saya menggunakan janji untuk mengendalikan API ini dan bagaimanakah saya "menjanjikan"nya? </h3>
Hari ini, saya boleh melakukannya
Node.js
中使用Promise
sebagai kaedah Javascript biasa.Contoh
Promise
yang mudah dan asas (menggunakan kaedah KISS):BiasaKod API tak segerak Javascript:
Promise
Kod API tak segerak JavaScript:(Saya cadangkan melawat sumber hebat ini)
Selain itu,
Promise
也可以与ES7
中的asyncawait
一起使用,使程序流程等待fulfilled
juga boleh digunakan denganasyncawait
dalamES7
untuk membuat aliran program menunggu keputusandipenuhi
, seperti yang ditunjukkan di bawah:Menggunakan kod yang sama, anda boleh menggunakan kaedah
.then()
:Promise
也可以在任何基于Node.js的平台上使用,比如react-native
Juga boleh digunakan pada mana-mana platform berasaskan Node.js, sepertireact-native
.Bonus: kaedah mencampurkan
(Andaikan kaedah panggil balik mempunyai dua parameter, ralat dan hasil)
Kaedah di atas boleh bertindak balas kepada keputusan panggilan balik gaya lama dan penggunaan Promise.
Semoga ini membantu.
Janji ada keadaan, ia bermula dalam keadaan tertunda dan boleh diselesaikan sebagai:
Fungsi yang mengembalikan janji tidak seharusnya membuang pengecualian tetapi sebaliknya membalas penolakan. Melemparkan pengecualian daripada fungsi yang mengembalikan janji akan memaksa anda menggunakan kedua-dua
.} catch {
} catch {
和.catch
dan.catch
. Orang yang menggunakan API berasaskan janji tidak mahu janji membuang pengecualian. Jika anda tidak pasti cara API async berfungsi dalam JS, mula-mula lihat jawapan ini.then
Oleh itu, mencipta janji biasanya bermaksud menentukan bila ia diselesaikan - bermakna apabila ia beralih ke peringkat Dipenuhi atau Ditolak untuk menunjukkan bahawa data itu tersedia (dan boleh diakses menggunakanPromise
Gunakan pelaksanaan janji moden (seperti janji ES6 asli) yang menyokongonSuccess
和onFail
API ini agak biasa kerana panggilan balik adalah perkara biasa dalam JS. Mari lihat situasi biasaPromise
Gunakan pelaksanaan janji moden (seperti janji ES6 asli) yang menyokong pembina:$.Deferred(fn)
形式,它的优点是允许我们编写一个非常接近new Promise(fn)
jQuery juga menyediakan ungkapan dalam bentuk , seperti yang ditunjukkan di bawah:resolve
和reject
Nota: Di sini kami mengambil kesempatan daripada fakta bahawa kaedah tertunda jQuery adalah "boleh ditanggalkan"; iaitu ia terikat kepada contoh jQuery.Deferred(). Tidak semua perpustakaan menyediakan fungsi ini.4 Seluruh perpustakaan menggunakan panggilan balik gaya Nod:
Tiada peraturan emas di sini, anda boleh menukarnya menjadi komitmen satu demi satu. Walau bagaimanapun, beberapa pelaksanaan janji membolehkan anda melakukan ini dalam kelompok, contohnya dalam Bluebird menukar API nodeback kepada API janji adalah semudah ini:
atau gunakan Janji asli dalam Nod:
Nota:
.then
处理程序中时,当然不需要将事物转换为承诺。从.then
处理程序返回一个承诺将使用该承诺的值解决或拒绝。从.then
pengendali - ini dikenali sebagai keselamatan melontar janji.onload
情况中,您应该使用addEventListener
而不是onX
.