Promise/Deferred adalah spesifikasi yang baik untuk menangani pengkodean panggilan asinkron. Berikut ini menggunakan kode nodejs sebagai kelas untuk mengimplementasikan implementasi sederhana dari spesifikasi/A
Salinan kode adalah sebagai berikut:
/**
* Dibuat dengan Webstorm JetBrains.
* Pengguna: Xuwenmin
* Tanggal: 14-4-1
* Waktu: 9:54 pagi
* Untuk mengubah template ini gunakan file | Pengaturan | Templat file.
*/
var eventemitter = membutuhkan ('acara'). Eventemitter;
var http = membutuhkan ('http');
var util = membutuhkan ('util');
// tentukan objek janji
var janji = function () {
// Menerapkan kelas acara warisan
Eventemitter.call (ini);
}
// Metode umum acara mewarisi
util.inherite (janji, Eventemitter);
// Metode kemudian adalah metode dalam spesifikasi Promise/A
Janji.prototype.then = function (SuccessHandler, Errorhandler, ProgressHandler) {
if (typeof suckshandler == 'function') {
this.once ('Success', Successhandler);
}
if (typeof errorHandler === 'function') {
this.once ('error', errorhandler);
}
if (typeof progressHandler === 'function') {
this.on ('Proses', ProgressHandler);
}
kembalikan ini;
}
// Tentukan objek penundaan
// berisi keadaan dan objek janji
var ditangguhkan = fungsi () {
this.state = 'tidak terpenuhi';
this.promise = new janji ();
}
Deferred.prototype.resolve = function (obj) {
this.state = 'terpenuhi';
this.promise.emit ('sukses', obj);
}
Deferred.Prototype.REJECT = function (err) {
this.state = 'gagal';
this.promise.emit ('error', err);
}
Deferred.prototype.progress = function (data) {
this.promise.emit ('proses', data);
}
// Gunakan permintaan HTTP untuk menggunakan janji/ditunda yang ditentukan di atas
var client = function () {
var options = {
Nama host: 'www.baidu.com',
Port: 80,
jalur:'/',
Metode: 'Dapatkan'
};
var ditangguhkan = baru ditangguhkan ();
var req = http.Request (option, function (res) {
res.setencoding ('UTF-8');
var data = '';
res.on ('data', function (chunk) {
data += chunk;
Deferred.progress (chunk);
});
res.on ('end', function () {
Deferred.resolve (data);
});
});
req.on ('error', function (err) {
Deferred.reject (err);
})
req.end ();
return ditangguhkan.promise;
}
client (). Kemudian (fungsi (data) {
console.log ('permintaan selesai', data);
}, function (err) {
console.log ('Access error', err);
}, function (chunk) {
Console.log ('Reading', chunk);
});
Simpan kode sebagai janji.js, Anda dapat menjalankannya di bawah baris perintah. Masukkan Node Promise.js secara langsung untuk melihat efek berjalan.