Cách gửi dữ liệu bằng JavaScript từ cuộc gọi lại thành công AJAX tới Chart.js

AJAX

Hiểu cách xử lý dữ liệu từ AJAX đến Chart.js

Xử lý dữ liệu không đồng bộ là một khó khăn thường gặp đối với những người mới thiết kế các ứng dụng trực tuyến động, đặc biệt là với JavaScript. Khi cố gắng đưa dữ liệu bên ngoài vào khung trực quan hóa như Chart.js, vấn đề này trở nên phức tạp hơn. Một tình huống điển hình là sử dụng lệnh gọi AJAX để truy xuất dữ liệu thời tiết, sau đó dữ liệu này được chuyển sang một hàm khác để hiển thị đồ họa.

Một phương pháp lý tưởng để lấy dữ liệu từ máy chủ là gọi lại thành công AJAX. Tuy nhiên, khó khăn thực sự là ở việc chuyển dữ liệu này sang các hoạt động hoặc quy trình JavaScript khác, chẳng hạn như tạo biểu đồ. Lúc đầu, việc hiểu quy trình này có vẻ đáng sợ đối với những người không quen với JavaScript.

Chúng tôi sẽ mổ xẻ quy trình từng bước trong hướng dẫn này. Để tạo động biểu đồ có nhãn và điểm dữ liệu từ máy chủ, chúng tôi sẽ hướng dẫn cách truy xuất dữ liệu bằng AJAX, phân tích cú pháp và sau đó gửi dữ liệu đó vào Chart.js một cách chính xác. Bạn sẽ có được năng lực xử lý hiệu quả dữ liệu không đồng bộ trong phương pháp này.

Sau khi đọc hướng dẫn này, bạn sẽ có thể truyền dữ liệu thời tiết đến thư viện biểu đồ để thể hiện trực quan ngoài việc biết cách nhận dữ liệu đó qua AJAX. Bây giờ chúng ta hãy bắt đầu sửa lỗi!

Yêu cầu Ví dụ về sử dụng
$.ajax() Đây là cách gửi yêu cầu HTTP không đồng bộ bằng jQuery. Nó được sử dụng trong ví dụ để lấy thông tin khí tượng từ máy chủ. Lệnh gọi lại thành công của nó quản lý phản hồi và hỗ trợ một số phương thức HTTP, bao gồm GET và POST.
JSON.parse() Tạo một đối tượng JavaScript từ một chuỗi JSON. Trong trường hợp này, nó chuyển đổi thông tin thời tiết được gửi từ máy chủ thành một đối tượng để tập lệnh có thể truy cập vào các mảng thời gian và nhiệt độ được lồng vào nhau.
Chart() Sử dụng gói Chart.js, tập lệnh này tạo biểu đồ mới từ đầu. Nó mô tả dữ liệu (nhãn và bộ dữ liệu), loại biểu đồ (chẳng hạn như "đường") và các lựa chọn cài đặt. Nó được sử dụng trong ví dụ này để tạo ra một biểu đồ đường hiển thị dữ liệu nhiệt độ dưới dạng hàm của thời gian.
context('2d') Lấy bối cảnh hiển thị 2D của phần tử canvas. Để vẽ biểu đồ trên phần tử canvas, cần có lệnh này. Nó làm cho nội dung đồ họa có thể hiển thị được bằng Chart.js.
fetch() API JavaScript hiện đại để yêu cầu mạng được gọi là Tìm nạp. Cách tiếp cận async/await sử dụng mã không đồng bộ hợp lý và hiệu quả hơn để truy xuất dữ liệu từ máy chủ mà không yêu cầu gọi lại, thay thế $.ajax().
async/await So với lệnh gọi lại hoặc lời hứa, các lệnh này hiệu quả hơn trong việc xử lý các hoạt động không đồng bộ. Ví dụ này cung cấp luồng rõ ràng hơn để xử lý dữ liệu không đồng bộ bằng cách sử dụng async để khai báo hàm không đồng bộ và chờ tạm dừng thực thi cho đến khi lời hứa tìm nạp() được giải quyết.
.then() Kỹ thuật này được áp dụng cho lời hứa và được liên kết để quản lý việc chấp nhận hoặc từ chối lời hứa. Sau khi dữ liệu thời tiết được truy xuất thành công, phương pháp mô-đun sẽ xử lý dữ liệu đó và gửi đến chức năng kết xuất biểu đồ.
.catch() Địa chỉ hứa hẹn lỗi. Để cung cấp khả năng xử lý lỗi mạnh mẽ trong mã, mẫu tập lệnh sẽ phát hiện bất kỳ sự cố nào với lời hứa LoadSkiResortData(), chẳng hạn như lỗi mạng và ghi thông báo lỗi vào bảng điều khiển.
beginAtZero Tùy chọn Chart.js này đảm bảo rằng biểu đồ hiển thị thích hợp các giá trị nhiệt độ thấp hơn bằng cách buộc trục Y bắt đầu từ 0. Đó là một cài đặt cụ thể trong thiết lập biểu đồ giúp cải thiện độ rõ ràng của hiển thị dữ liệu.

Phá vỡ luồng dữ liệu AJAX trong JavaScript

Các tập lệnh nói trên chỉ cho bạn cách nhận và chuyển dữ liệu từ lệnh gọi lại thành công AJAX sang một hàm khác—trong trường hợp này là để mô tả dữ liệu bằng Chart.js. Quy trình bắt đầu bằng lệnh gọi AJAX thực hiện yêu cầu GET tới điểm cuối của máy chủ bằng cách sử dụng phương thức từ jQuery. Trong trường hợp này, dữ liệu thời tiết được cung cấp bởi điểm cuối. Phản hồi được gửi ở định dạng JSON, phương thức sử dụng để phân tích cú pháp thành một đối tượng JavaScript. Đây là một bước quan trọng vì nó cho phép chúng tôi làm việc với dữ liệu chúng tôi nhận được từ máy chủ. Ví dụ: chúng ta có thể trích xuất các giá trị nhiệt độ và thời gian hàng giờ, đồng thời sử dụng dữ liệu đó để thay đổi dữ liệu được cung cấp vào phiên bản Chart.js.

Kịch bản sau đó chuyển sang phương thức gọi lại, trong đó dữ liệu thời tiết được ghi vào bảng điều khiển để gỡ lỗi khi dữ liệu được truy xuất và phân tích thành công. Để đảm bảo rằng dữ liệu phù hợp đang được nhận, đây là một quy trình tiêu chuẩn đang được phát triển. Chúng tôi gọi hoạt động sau khi xác minh tính chính xác của dữ liệu, cung cấp mảng thời gian và mảng nhiệt độ dưới dạng hai phần dữ liệu thiết yếu. Phương pháp này cho thấy tầm quan trọng của việc sử dụng các hàm mô-đun để duy trì tổ chức và tái sử dụng mã.

Bước cuối cùng trong việc sử dụng Chart.js để trực quan hóa dữ liệu là chức năng. Điều này đòi hỏi phải sử dụng các để lấy bối cảnh hiển thị 2D của phần tử canvas trước. Canvas đã sẵn sàng để hiển thị đồ họa bằng cách này. Sau đó, một đối tượng Biểu đồ mới được xây dựng và cấu hình của nó được đặt để xác định dữ liệu sẽ được hiển thị cùng với loại biểu đồ (trong trường hợp này là 'đường'). Tập dữ liệu chứa số đọc nhiệt độ được đặt thành các giá trị nhiệt độ lấy từ phản hồi của máy chủ và các nhãn trong biểu đồ được đặt thành giá trị thời gian thu được từ lệnh gọi AJAX.

Cuối cùng, chúng tôi đã đưa tính năng xử lý lỗi vào mọi giải pháp để đảm bảo rằng trong trường hợp yêu cầu AJAX gặp trục trặc, một thông báo sẽ được ghi vào bảng điều khiển. Điều này rất cần thiết để tạo các ứng dụng web đáng tin cậy vì nó cho phép các nhà phát triển xác định các sự cố có thể xảy ra trước khi người dùng bị ảnh hưởng. Các phương pháp hiện đại như Promises và giúp làm cho tính chất không đồng bộ của các cuộc gọi AJAX dễ đọc và được quản lý hơn. So với mã nặng về gọi lại thông thường, các kỹ thuật này cung cấp một cách hiệu quả và rõ ràng hơn để truy xuất dữ liệu và tạo biểu đồ.

Giải pháp 1: Truyền dữ liệu AJAX tới Chart.js bằng lệnh gọi lại

Phương thức này hiển thị biểu đồ bằng Chart.js và sử dụng jQuery cho AJAX. Lệnh gọi lại được sử dụng trong giải pháp chuyển dữ liệu từ phương thức thành công AJAX sang một hàm khác.

$(document).ready(function() {
    loadSkiResortData();
});

function loadSkiResortData() {
    $.ajax({
        method: 'GET',
        url: '/admin/sknowed/loadSkiResortData',
        success: function(response) {
            const obj = JSON.parse(response.weatherData);
            const temperatures = obj.hourly.temperature_2m;
            const times = obj.hourly.time;
            renderChart(times, temperatures);
        },
        error: function() {
            console.error('Failed to load data');
        }
    });
}

function renderChart(labels, data) {
    const ctx = document.getElementById('myChart').getContext('2d');
    new Chart(ctx, {
        type: 'line',
        data: {
            labels: labels,
            datasets: [{
                label: 'Temperature Over Time',
                data: data,
                borderWidth: 1
            }]
        },
        options: {
            responsive: true,
            scales: {
                y: {
                    beginAtZero: true
                }
            }
        }
    });
}

Giải pháp 2: Cách tiếp cận mô-đun với những lời hứa

Trong phương pháp này, mã được mô-đun hóa và dữ liệu từ trình xử lý thành công AJAX được truyền qua lời hứa JavaScript thay vì lệnh gọi lại. Kết quả là khả năng đọc và tính linh hoạt tốt hơn được đảm bảo.

$(document).ready(function() {
    loadSkiResortData()
        .then(data => {
            const { temperature_2m, time } = data.hourly;
            renderChart(time, temperature_2m);
        })
        .catch(error => console.error('Error loading data:', error));
});

function loadSkiResortData() {
    return new Promise((resolve, reject) => {
        $.ajax({
            method: 'GET',
            url: '/admin/sknowed/loadSkiResortData',
            success: function(response) {
                const data = JSON.parse(response.weatherData);
                resolve(data);
            },
            error: function(error) {
                reject(error);
            }
        });
    });
}

function renderChart(labels, data) {
    const ctx = document.getElementById('myChart').getContext('2d');
    new Chart(ctx, {
        type: 'line',
        data: {
            labels: labels,
            datasets: [{
                label: 'Temperature Over Time',
                data: data,
                borderWidth: 1
            }]
        },
        options: {
            responsive: true,
            scales: {
                y: {
                    beginAtZero: true
                }
            }
        }
    });
}

Giải pháp 3: Sử dụng API tìm nạp với Async/Await

Cách tiếp cận này sử dụng async/await để xử lý dữ liệu không đồng bộ và thay thế jQuery AJAX bằng API tìm nạp mới hơn. Để đảm bảo tính mạnh mẽ, việc xử lý lỗi cũng được bao gồm.

document.addEventListener('DOMContentLoaded', async () => {
    try {
        const data = await loadSkiResortData();
        const { temperature_2m, time } = data.hourly;
        renderChart(time, temperature_2m);
    } catch (error) {
        console.error('Error loading data:', error);
    }
});

async function loadSkiResortData() {
    const response = await fetch('/admin/sknowed/loadSkiResortData');
    if (!response.ok) {
        throw new Error('Network response was not ok');
    }
    const result = await response.json();
    return JSON.parse(result.weatherData);
}

function renderChart(labels, data) {
    const ctx = document.getElementById('myChart').getContext('2d');
    new Chart(ctx, {
        type: 'line',
        data: {
            labels: labels,
            datasets: [{
                label: 'Temperature Over Time',
                data: data,
                borderWidth: 1
            }]
        },
        options: {
            responsive: true,
            scales: {
                y: {
                    beginAtZero: true
                }
            }
        }
    });
}

Khám phá xử lý dữ liệu trong JavaScript bằng AJAX và Chart.js

Một vấn đề lớn mà các nhà phát triển thường gặp phải khi xử lý JavaScript và AJAX là làm thế nào để truyền dữ liệu một cách hiệu quả giữa các hàm và phương thức không đồng bộ. Bởi vì AJAX không đồng bộ về mặt thiết kế nên không phải lúc nào bạn cũng có thể dự đoán được khi nào dữ liệu sẽ có thể truy cập được. Điều này có thể gây khó khăn hơn khi sử dụng dữ liệu đó trong các khu vực khác của ứng dụng, chẳng hạn như khi bạn gửi dữ liệu đó đến thư viện để trực quan hóa như . Lệnh gọi lại và hàm mô-đun là những cách được tổ chức tốt để xử lý luồng này và đảm bảo rằng dữ liệu được truyền chính xác.

Một phương pháp quan trọng nữa là sử dụng và những lời hứa. Lời hứa đảm bảo rằng dữ liệu chỉ được xử lý sau khi yêu cầu AJAX hoàn thành thành công, giúp bạn quản lý luồng dữ liệu hiệu quả hơn. Điều này làm giảm nhu cầu về các lệnh gọi lại lồng nhau cao, đôi khi được gọi là "địa ngục gọi lại" và cải thiện khả năng đọc mã. Các nhà phát triển có thể nén mã không đồng bộ thành cấu trúc đồng bộ bằng cách sử dụng không đồng bộ/đang chờ, điều này làm cho quá trình xử lý dữ liệu trở nên dễ hiểu và gỡ lỗi hơn rất nhiều.

Quản lý lỗi là điều cần thiết đối với JavaScript hiện đại cũng như việc thu thập và truyền dữ liệu. Điều cần thiết là phải bao gồm các kỹ thuật xử lý lỗi thích hợp, chẳng hạn như , trong các hàm không đồng bộ của bạn. Điều này đảm bảo rằng chương trình không gặp sự cố nếu có lỗi trong quá trình truy xuất dữ liệu (chẳng hạn như sự cố mạng hoặc sự cố máy chủ). Thay vì làm hỏng toàn bộ ứng dụng, các thông báo lỗi được phát hiện và xử lý một cách khéo léo, thậm chí đôi khi còn cảnh báo cho người dùng về sự cố.

  1. Làm cách nào để chuyển dữ liệu AJAX sang chức năng khác?
  2. Để gửi dữ liệu đến một phương thức khác, hãy sử dụng hàm gọi lại trong xử lý cuộc gọi AJAX.
  3. Vai trò của là gì trong việc xử lý dữ liệu máy chủ?
  4. Để thuận tiện cho việc thao tác dữ liệu, chuyển đổi phản hồi chuỗi JSON của máy chủ thành đối tượng JavaScript.
  5. Làm cách nào để xử lý lỗi trong cuộc gọi AJAX?
  6. Để quản lý lỗi một cách hiệu quả, hãy sử dụng một chặn trong một yêu cầu hoặc sử dụng gọi lại trong AJAX.
  7. Làm cách nào để đảm bảo dữ liệu động được cập nhật trong biểu đồ của tôi?
  8. Sau khi thêm nhãn hoặc dữ liệu mới, hãy gọi trên của bạn đối tượng để cập nhật biểu đồ với các giá trị gần đây nhất.
  9. Làm thế nào trợ giúp với các yêu cầu AJAX?
  10. làm cho mã không đồng bộ xuất hiện đồng bộ hơn, nâng cao khả năng đọc và xử lý lỗi cuộc gọi AJAX.

Khi phát triển các ứng dụng trực tuyến động, việc truyền dữ liệu từ hàm thành công AJAX sang các phần khác trong mã của bạn là điều cần thiết. Bạn có thể đảm bảo mã sạch, có thể tái sử dụng và đẩy nhanh quá trình này bằng cách sử dụng các hàm mô-đun.

Hơn nữa, các nhà phát triển có thể quản lý dữ liệu không đồng bộ tốt hơn bằng cách sử dụng các chiến lược như Và , giúp nâng cao khả năng đọc và khả năng bảo trì. Khi lỗi được xử lý chính xác, giải pháp sẽ trở nên đáng tin cậy và dễ sử dụng.

  1. Xây dựng các yêu cầu AJAX trong jQuery và cung cấp thông tin chi tiết đầy đủ về lập trình JavaScript không đồng bộ. Bạn có thể tìm thấy các ví dụ chi tiết hơn tại Tài liệu jQuery AJAX .
  2. Cung cấp tài liệu chi tiết về cách sử dụng Chart.js để trực quan hóa dữ liệu, bao gồm thiết lập bộ dữ liệu động và cấu hình biểu đồ: Tài liệu Chart.js .
  3. Cung cấp hướng dẫn chuyên sâu về API tìm nạp của JavaScript và cách sử dụng API này với Lời hứa dành cho lập trình không đồng bộ: Tài liệu web MDN - API tìm nạp .
  4. Giải thích việc sử dụng async/await để xử lý các hàm không đồng bộ trong JavaScript, với nhiều ví dụ về mã: JavaScript.info - Không đồng bộ/Đang chờ .