Misalkan skenario bisnis:
Melalui alamat RSS, dapatkan RSS dan simpan di file, dan alamat RSS disimpan dalam file.
Untuk menyelesaikan bisnis dalam skenario ini, tiga tugas diperlukan:
1. Baca alamat RSS dari file.
2. Dapatkan RSS.
3. Simpan dalam file.
Akhirnya, ketiga tugas ini terintegrasi.
Mempersiapkan:
File yang menyimpan alamat RSS, alamat.txt.
http://programmer.csdn.net/rss_programmer.html
Tugas 1:
Baca konten file alamat RSS dan kembalikan melalui panggilan balik.
Salinan kode adalah sebagai berikut:
var getRsSaddress = function (path, callback) {
fs.readfile (path, {encoding: 'utf8'}, function (err, data) {
panggilan balik (err, data);
});
}
Tugas 2:
Dapatkan RSS melalui alamat RSS dan mengembalikan kesalahan atau data melalui panggilan balik.
Salinan kode adalah sebagai berikut:
var getRSS = function (url, callback) {
var data = '';
http.get (url, function (res) {
res.on ('data', function (chrunk) {
data += chrunk;
});
res.on ('end', function () {
Callback (null, data);
});
}). on ('error', function (err) {
callback (err, null);
});
}
Tugas 3:
Simpan RSS dalam file dan kembalikan kesalahan melalui panggilan balik.
Salinan kode adalah sebagai berikut:
var saverss = function (data, callback) {
fs.writeFile ('rss.txt', data, 'utf8', function (err) {
callback (err);
});
}
Integrasi:
Salinan kode adalah sebagai berikut:
getRsSaddress ('address.txt', function (err, data) {
if (err) {
console.log (err);
kembali;
}
getRSS (data, fungsi (err, data) {
if (err) {
console.log (err);
kembali;
}
Saverss (data, fungsi (err) {
if (err) console.log (err);
});
});
});
Kode di atas sepenuhnya pemrosesan asinkron. Panggilan balik yang paling umum digunakan untuk menangani pengembalian logika asinkron. Keuntungannya adalah metode penulisan standar mudah untuk diterima semua orang; Kerugiannya adalah bahwa kopling terlalu kuat, penanganan pengecualian adalah bahwa kodenya tidak intuitif, terutama ketika berhadapan dengan logika bisnis yang kompleks dan banyak tugas, callback berlapis akan membuat orang melihat mereka dan kodenya sulit untuk dipertahankan.
Salah satu implementasi spesifikasi janji/A adalah kapan.js, yang ditujukan untuk domain masalah tersebut.
Mari kita lihat kode yang dimodifikasi.
Tugas 1:
Salinan kode adalah sebagai berikut:
var getRsSaddress = function (path) {
var ditangguhkan = when.defer ();
fs.readfile (path, {encoding: 'utf8'}, function (err, data) {
if (err) ditangguhkan.
Deferred.resolve (data);
});
return ditangguhkan.promise;
}
Tugas 2:
Salinan kode adalah sebagai berikut:
var getRSS = function (url) {
var ditangguhkan = when.defer ();
var data = '';
http.get (url, function (res) {
res.on ('data', function (chrunk) {
data += chrunk;
});
res.on ('end', function () {
Deferred.resolve (data);
});
}). on ('error', function (err) {
Deferred.reject (err);
});
return ditangguhkan.promise;
}
Tugas 3:
Salinan kode adalah sebagai berikut:
var saverss = function (data) {
var ditangguhkan = when.defer ();
fs.writeFile ('rss.txt', data, 'utf8', function (err) {
if (err) ditangguhkan.
Deferred.resolve ();
});
return ditangguhkan.promise;
}
Integrasi:
Salinan kode adalah sebagai berikut:
getrssaddress ('address.txt')
.then (getRSS)
.then (Saverss)
.catch (function (err) {
console.log (err);
});
menjelaskan:
Model "Deferred/Promise" yang ditentukan oleh Spesifikasi Janji/A adalah model "Publish/Pelanggan". Acara penerbitan melalui objek yang ditangguhkan dapat berupa acara penyelesaian penyelesaian atau acara penolakan yang gagal; Langganan yang lengkap atau gagal dilakukan melalui objek Promise.
Dalam spesifikasi janji/A, setiap tugas memiliki tiga negara: default (tertunda), terpenuhi (terpenuhi), dan gagal (ditolak).
1. Negara default dapat ditransfer ke status penyelesaian dalam satu arah. Proses ini disebut Resolve, dan metode yang sesuai ditangguhkan.
2. Keadaan default juga dapat ditransfer ke keadaan yang gagal dalam satu arah. Proses ini disebut tolak, dan metode yang sesuai ditangguhkan.
3. Dalam status default, Anda juga dapat mendeklarasikan informasi pelaksanaan tugas melalui Deferred.Notify (UPDATE), seperti kemajuan eksekusi;
4. Transfer negara adalah satu kali. Setelah tugas berubah dari awal yang tertunda ke negara bagian lain, ia akan memasuki proses eksekusi tugas berikutnya.
Ikuti kode di atas.
Tentukan objek yang ditangguhkan melalui when.defer.
var ditangguhkan = when.defer ();
Setelah data asinkron berhasil diperoleh, acara penyelesaian diterbitkan.
Deferred.resolve (data);
Setelah akuisisi data asinkron gagal, peristiwa yang gagal diterbitkan.
Deferred.reject (err);
Dan mengembalikan objek janji sebagai langganan.
return ditangguhkan.promise;
Langganan adalah langganan yang diselesaikan/gagal/diberitahukan melalui metode saat itu dari objek janji.
getrssaddress ('address.txt')
.then (getRSS)
Lalu ada tiga parameter, yaitu onfulfilled, onrejected, dan onprogress
janji.
Tugas sebelumnya adalah Resolve (Data), dan fungsi yang lebih tinggi akan dipicu, dan data akan digunakan sebagai parameternya.
Jika tugas sebelumnya ditolak (alasan), maka onrejected akan dipicu dan alasan akan diterima.
Kapan saja, hanya satu dari yang dipenuhi dan satu kali yang dapat dipicu dan hanya sekali.
Untuk menangani pengecualian, when.js juga menyediakan metode yang sangat nyaman. Kemudian dapat melewati kesalahan. Ketika beberapa tugas dieksekusi secara serial, kita hanya dapat mendefinisikan satu -satunya yang terakhir. Anda juga dapat memanggil fungsi penangkapan setelah yang terakhir untuk menangkap pengecualian tugas apa pun.
Ini adalah cara sederhana dan jelas untuk menulisnya.
Salinan kode adalah sebagai berikut:
getrssaddress ('address.txt')
.then (getRSS)
.then (Saverss)
.catch (function (err) {
console.log (err);
});
Promise membawa kenyamanan besar pada pemrograman asinkron, memungkinkan kita untuk fokus pada implementasi satu tugas tanpa jatuh ke dalam kemalangan piramida. Kode di atas hanya penggunaan dasar. When.js memberikan lebih dari fungsi yang disebutkan dalam artikel ini, silakan merujuk ke API resmi untuk detailnya.