Sự khác biệt giữa await và từ khóa yield trong Javascript

Javascript là một ngôn ngữ lập trình phổ biến hiện nay, được sử dụng rộng rãi trong việc phát triển web. Trong Javascript, hai từ khóa “await” và “yield” đều được sử dụng để quản lý các tác vụ bất đồng bộ, nhưng chúng có những khác biệt quan trọng. Hãy cùng tìm hiểu chi tiết về sự khác biệt giữa await và từ khóa yield trong Javascript.

Await trong Javascript

Từ khóa await được sử dụng trong các hàm bất đồng bộ (async function) để chờ một Promise hoàn thành trước khi tiếp tục thực thi phần còn lại của hàm.

// Tạo hàm async với từ khóa await
async function fetchData() {
    try {
        const response = await fetch('https://api.example.com/data'); // Chờ đợi Promise được giải quyết
        const data = await response.json(); // Chờ đợi Promise được giải quyết tiếp theo
        console.log(data); // Hiển thị dữ liệu
    } catch (error) {
        console.error('Error fetching data:', error); // Xử lý lỗi nếu có
    }
}

fetchData(); // Gọi hàm

Cách hoạt động của await

await chỉ có thể được sử dụng trong các hàm async.
– Nó tạm dừng quá trình thực thi của hàm cho đến khi Promise được hoàn thành (resolve hoặc reject).
– Khi Promise hoàn thành, giá trị kết quả sẽ được trả về và tiếp tục thực thi phần còn lại của hàm.

Yield trong Javascript

Từ khóa yield được sử dụng trong các hàm sinh (generator function) để tạm dừng và tiếp tục việc thực thi của hàm tại các điểm xác định.

function* generatorExample() {
    yield 1; // Tạm dừng hàm và trả về giá trị 1
    yield 2; // Tạm dừng hàm và trả về giá trị 2
    return 3; // Kết thúc hàm và trả về giá trị 3
}

const generator = generatorExample();

console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: 3, done: true }

Cách hoạt động của yield

– yield chỉ có thể được sử dụng trong các hàm sinh (hàm có định dạng function*).
– Nó tạm dừng quá trình thực thi của hàm tại điểm yield và trả về giá trị.
– Để tiếp tục thực thi hàm từ điểm tạm dừng, ta sử dụng phương thức `next()`.

Sự khác biệt chính giữa await và yield

Tiêu chí await yield
Sử dụng trong loại hàm Hàm bất đồng bộ (async function) Hàm sinh (function*)
Chức năng Tạm dừng hàm cho đến khi Promise được hoàn tất Tạm dừng hàm và trả về giá trị tại điểm xác định
Quản lý tác vụ bất đồng bộ Quản lý các tác vụ bất đồng bộ Không trực tiếp quản lý các tác vụ bất đồng bộ
Cách tiếp tục thực thi Tự động tiếp tục sau khi Promise hoàn thành Cần gọi phương thức next() để tiếp tục

Ví dụ nâng cao và chuyên sâu

Await với Promise chain

// Hàm async với nhiều await
async function multiAwait() {
    const step1 = await new Promise(resolve => setTimeout(() => resolve('Step 1 Complete'), 1000));
    console.log(step1);

    const step2 = await new Promise(resolve => setTimeout(() => resolve('Step 2 Complete'), 1000));
    console.log(step2);

    const step3 = await new Promise(resolve => setTimeout(() => resolve('Step 3 Complete'), 1000));
    console.log(step3);
}

multiAwait();

Yield trong việc quản lý luồng điều khiển

function* taskManager() {
    console.log('Task 1 started');
    yield; // Tạm dừng tại đây

    console.log('Task 2 started');
    yield; // Tạm dừng tại đây

    console.log('Task 3 started');
    return 'All tasks completed';
}

const manager = taskManager();

manager.next(); // Bắt đầu Task 1
manager.next(); // Bắt đầu Task 2
manager.next(); // Bắt đầu Task 3 và kết thúc

Kết luận

Việc hiểu sự khác biệt giữa await và từ khóa yield trong Javascript là rất quan trọng để quản lý các tác vụ bất đồng bộ một cách hiệu quả. Từ khóa await giúp xử lý các Promise một cách dễ dàng và linh hoạt trong các hàm async, trong khi yield cung cấp cách khá mạnh mẽ để quản lý luồng điều khiển trong các hàm sinh. Hiểu rõ cách sử dụng từng từ khóa sẽ giúp bạn trở nên thành thạo hơn trong lập trình Javascript và tối ưu hóa mã nguồn của bạn.