Saya memiliki modul node sederhana yang terhubung ke database dan memiliki beberapa fungsi untuk menerima data, misalnya fungsi ini:
dbConnection.js:
import mysql from 'mysql';
const connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: 'db'
});
export default {
getUsers(callback) {
connection.connect(() => {
connection.query('SELECT * FROM Users', (err, result) => {
if (!err){
callback(result);
}
});
});
}
};
Modul tersebut akan dipanggil dengan cara ini dari modul node yang berbeda:
app.js:
import dbCon from './dbConnection.js';
dbCon.getUsers(console.log);
Saya ingin menggunakan promise daripada callback untuk mengembalikan data. Sejauh ini saya telah membaca tentang janji bersarang di utas berikut: Menulis Kode Bersih Dengan Janji Bersarang , tetapi saya tidak dapat menemukan solusi apa pun yang cukup sederhana untuk kasus penggunaan ini. Apa cara yang benar untuk kembali result
menggunakan janji?
Jawaban:
Menggunakan
Promise
kelasSaya sarankan untuk melihat dokumen MDN's Promise yang menawarkan titik awal yang baik untuk menggunakan Promises. Atau, saya yakin ada banyak tutorial yang tersedia secara online. :)
Catatan: Browser modern sudah mendukung spesifikasi ECMAScript 6 dari Promises (lihat dokumen MDN yang ditautkan di atas) dan saya berasumsi bahwa Anda ingin menggunakan implementasi asli, tanpa pustaka pihak ketiga.
Adapun contoh sebenarnya ...
Prinsip dasarnya bekerja seperti ini:
resolve
danreject
Ini mungkin terlihat banyak, jadi inilah contoh sebenarnya.
Menggunakan fitur bahasa async / await (Node.js> = 7.6)
Di Node.js 7.6, compiler JavaScript v8 telah diupgrade dengan dukungan async / await . Anda sekarang dapat mendeklarasikan fungsi sebagai
async
, yang berarti fungsi tersebut secara otomatis mengembalikanPromise
yang diselesaikan saat fungsi asinkron menyelesaikan eksekusi. Di dalam fungsi ini, Anda dapat menggunakanawait
kata kunci untuk menunggu hingga Promise lainnya terselesaikan.Berikut ini contohnya:
sumber
Dengan bluebird Anda dapat menggunakan
Promise.promisifyAll
(danPromise.promisify
) untuk menambahkan metode siap Promise ke objek apa pun.Dan gunakan seperti ini:
atau
Menambahkan disposers
Bluebird mendukung banyak fitur, salah satunya adalah disposers, memungkinkan Anda untuk dengan aman membuang koneksi setelah diakhiri dengan bantuan
Promise.using
danPromise.prototype.disposer
. Berikut contoh dari aplikasi saya:Kemudian gunakan seperti ini:
Ini secara otomatis akan mengakhiri koneksi setelah janji diselesaikan dengan nilai (atau ditolak dengan
Error
).sumber
try-catch
di setiap panggilan. Jadi, jika Anda melakukannya cukup sering, dan kompleksitas kode Anda mirip dengan sampel, Anda harus mempertimbangkannya kembali.Node.js versi 8.0.0+:
Anda tidak perlu menggunakan bluebird untuk menetapkan metode API node lagi. Karena, dari versi 8+ Anda dapat menggunakan util.promisify asli :
Sekarang, tidak perlu menggunakan lib pihak ketiga untuk melakukan janji.
sumber
Dengan asumsi API adaptor database Anda tidak menghasilkan
Promises
sendiri, Anda dapat melakukan sesuatu seperti:Jika database API mendukung,
Promises
Anda dapat melakukan sesuatu seperti: (di sini Anda melihat kekuatan Promises, fluff callback Anda cukup banyak menghilang)Menggunakan
.then()
untuk mengembalikan janji baru (bersarang).Telepon dengan:
Saya menggunakan API mockup untuk Janji saya, API Anda mungkin berbeda. Jika Anda menunjukkan API Anda, saya bisa menyesuaikannya.
sumber
Promise
konstruktor dan.promise()
metode?promise = new Promise();
?Promises
maka Anda tidak dapat menggunakan callback. Begitu Anda masuk ke wilayah janji, 'piramida' menghilang. Lihat contoh kode kedua tentang cara kerjanya.2019:
Gunakan modul asli tersebut
const {promisify} = require('util');
untuk mengonversi pola callback lama yang biasa menjadi pola promise sehingga Anda bisa mendapatkan keuntungan dariasync/await
kodesumber
Saat menyiapkan janji, Anda mengambil dua parameter,
resolve
danreject
. Jika berhasil, panggilresolve
dengan hasil, dalam kasus panggilan gagalreject
dengan kesalahan.Kemudian Anda bisa menulis:
callback
akan dipanggil dengan hasil dari janji yang dikembalikangetUsers
, yaituresult
sumber
Menggunakan perpustakaan Q misalnya:
sumber
Kode di bawah ini hanya berfungsi untuk node -v> 8.x
Saya menggunakan ini middleware MySQL yang Dijanjikan untuk Node.js
baca artikel ini Membuat Database MySQL Middleware dengan Node.js 8 dan Async / Await
database.js
Anda harus meningkatkan node -v> 8.x
Anda harus menggunakan fungsi async agar bisa menggunakan await.
contoh:
sumber