Rumah >pangkalan data >tutorial mysql >Bagaimanakah Async/Await Boleh Menyelesaikan Isu Konkurensi Apabila Menyoal MySQL dalam Node.js?

Bagaimanakah Async/Await Boleh Menyelesaikan Isu Konkurensi Apabila Menyoal MySQL dalam Node.js?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-29 01:41:12569semak imbas

How Can Async/Await Solve Concurrency Issues When Querying MySQL in Node.js?

Pelaksanaan Asynchronous dalam Node.js: Menggunakan Async/Await dengan MySQL

Sebagai pendatang baharu Node.js, anda mungkin menghadapi kesukaran untuk menyesuaikan diri sintaks modennya, terutamanya apabila bekerja dengan operasi tak segerak. Mari kita terokai cara menggunakan kata kunci tak segerak/menunggu untuk mencapai hasil yang disegerakkan apabila menanyakan pangkalan data MySQL.

Dalam kod anda, anda ingin melaksanakan berbilang pertanyaan dan menggabungkan hasil menjadi satu rentetan. Walau bagaimanapun, memandangkan Node.js melaksanakan kod JavaScript dalam cara yang tidak menyekat, kod di bawah tidak menjamin bahawa pembolehubah string1 hingga string4 akan mengandungi hasil yang dijangkakan:

// Original Code
var string1 = '';
var string2 = '';
var string3 = '';
var string4 = '';

DatabasePool.getConnection((err, connection) => {
  // Query 1
  connection.query(query, (err, result) => {
    string1 = result;
  });

  // Query 2
  connection.query(query, (err, result) => {
    string2 = result;
  });

  // Query 3
  connection.query(query, (err, result) => {
    string3 = result;
  });

  // Query 4
  connection.query(query, (err, result) => {
    string4 = result;
  });

  // Attempt to concatenate results
  var appended_text = string1 + string2 + string3 + string4;
});

Penyelesaian dengan Async/ Tunggu

Untuk menyelesaikan isu ini dan membenarkan pelaksanaan segerak, Node.js 8 menyediakan fungsi util.promisify(). Begini cara untuk mengintegrasikannya dengan pustaka MySQL:

// Improved Code
const mysql = require('mysql');
const util = require('util');
const conn = mysql.createConnection({ yourHOST, yourUSER, yourPW, yourDB });

// Promisify the query method
const query = util.promisify(conn.query).bind(conn);

(async () => {
  try {
    // Execute queries concurrently
    const [query1Result, query2Result, query3Result, query4Result] = await Promise.all([
      query('select count(*) as count from file_managed'),
      query('another query'),
      query('another query'),
      query('another query'),
    ]);

    // Concatenate results
    const appended_text = query1Result[0].count + query2Result[0].count + query3Result[0].count + query4Result[0].count;
  } finally {
    // Close the connection
    conn.end();
  }
})();

Dalam kod yang disemak ini:

  • Kaedah pertanyaan ditukar kepada Promise menggunakan util.promisify().
  • Fungsi bind() memastikan bahawa ini masih merujuk kepada objek asal.
  • The Kaedah Promise.all() melaksanakan keempat-empat pertanyaan secara serentak dan mengembalikan tatasusunan hasil.
  • Hasil diekstrak dan digabungkan ke dalam appended_text.
  • Akhirnya, sambungan ditutup.

Pendekatan ini membolehkan anda menyegerakkan pertanyaan anda dengan lancar dan mendapatkan output yang diingini dalam cara yang boleh dipercayai cara, menjadikan async/menunggu alat yang berkuasa untuk mengendalikan operasi tak segerak dalam Node.js.

Atas ialah kandungan terperinci Bagaimanakah Async/Await Boleh Menyelesaikan Isu Konkurensi Apabila Menyoal MySQL dalam Node.js?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn