Xử lý lỗi

Frontend SELF VI
Mức độ , Bài học
Có sẵn

7.1 Sử dụng callbacks

Xử lý lỗi là một phần quan trọng trong việc viết code đáng tin cậy và chống lại sự cố. Trong JavaScript không đồng bộ, lỗi có thể xảy ra cả trong các hoạt động đồng bộ và không đồng bộ. Quản lý lỗi đúng cách giúp tránh các sự cố bất ngờ và cung cấp cho người dùng thông báo lỗi hữu ích. Hãy cùng xem qua vài phương pháp xử lý lỗi trong code không đồng bộ, bao gồm callbacks, promises và async/await.

Trước khi có promises và async/await, code không đồng bộ thường được thực hiện thông qua callbacks. Trong cách tiếp cận này, lỗi được truyền vào callback dưới dạng đối số đầu tiên.

Ví dụ:

JavaScript
    
      function fetchData(callback) {
        setTimeout(() => {
          const error = Math.random() > 0.5 ? new Error('Failed to fetch data') : null;
          const data = error ? null : { id: 1, name: 'John Doe' };
          callback(error, data);
        }, 1000);
      }

      fetchData((error, data) => {
        if (error) {
          console.error('Error:', error);
        } else {
          console.log('Data:', data);
        }
      });
    
  

7.2 Sử dụng promises

Xử lý lỗi với promises

Promises mang đến cách tiếp cận có cấu trúc hơn cho xử lý code không đồng bộ. Lỗi được xử lý thông qua phương thức catch.

Ví dụ:

JavaScript
    
      function fetchData() {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            const error = Math.random() > 0.5 ? new Error('Failed to fetch data') : null;
            if (error) {
              reject(error);
            } else {
              resolve({ id: 1, name: 'John Doe' });
            }
          }, 1000);
        });
      }

      fetchData()
        .then(data => console.log('Data:', data))
        .catch(error => console.error('Error:', error));
    
  

Xử lý lỗi với async/await

async/await cung cấp một cách viết cú pháp thuận tiện hơn để làm việc với code không đồng bộ, làm cho nó dễ đọc hơn và giống như đồng bộ hơn. Lỗi trong các hàm không đồng bộ có thể được xử lý thông qua cấu trúc try...catch.

Ví dụ:

JavaScript
    
      async function fetchData() {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            const error = Math.random() > 0.5 ? new Error('Failed to fetch data') : null;
            if (error) {
              reject(error);
            } else {
              resolve({ id: 1, name: 'John Doe' });
            }
          }, 1000);
        });
      }

      async function loadData() {
        try {
          const data = await fetchData();
          console.log('Data:', data);
        } catch (error) {
          console.error('Error:', error);
        }
      }

      loadData();
    
  

7.3 Xử lý lỗi toàn cục

Để xử lý lỗi toàn cục trong code không đồng bộ, bạn có thể sử dụng window.onErrorwindow.onUnhandledRejection.

Ví dụ cho window.onError:

JavaScript
    
      window.onerror = function (message, source, lineno, colno, error) {
        console.error('Global error handler:', error);
      };

      setTimeout(() => {
        throw new Error('Test error');
      }, 1000);
    
  

Ví dụ cho window.onunhandledrejection:

JavaScript
    
      window.onunhandledrejection = function (event) {
        console.error('Unhandled rejection:', event.reason);
      };

      Promise.reject(new Error('Test unhandled rejection'));
    
  

7.4 Ví dụ về sử dụng

1. Yêu cầu HTTP không đồng bộ với Fetch và xử lý lỗi:

JavaScript
    
      async function fetchData() {
        try {
          const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
          if (!response.ok) {
            throw new Error('Network response was not ok');
          }
          const data = await response.json();
          console.log('Data:', data);
        } catch (error) {
          console.error('Fetch error:', error);
        }
      }

      fetchData();
    
  

2. Thực hiện đồng thời các yêu cầu với Promise.all và xử lý lỗi:

JavaScript
    
      async function fetchMultipleData() {
        try {
          const [response1, response2] = await Promise.all([
            fetch('https://jsonplaceholder.typicode.com/posts/1'),
            fetch('https://jsonplaceholder.typicode.com/posts/2')
          ]);

          if (!response1.ok || !response2.ok) {
            throw new Error('One of the responses was not ok');
          }

          const data1 = await response1.json();
          const data2 = await response2.json();

          console.log('Data 1:', data1);
          console.log('Data 2:', data2);
        } catch (error) {
          console.error('Fetch multiple data error:', error);
        }
      }

      fetchMultipleData();
    
  
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION