2016-11-22 19 views
8

Tôi đã đọc this article và tự hỏi tại sao trong đoạn đầu tiên, số wait() chờ số wait() đầu tiên kết thúc trong khi đoạn thứ hai hai số wait() chạy không đồng bộ?Khi nào JavaScript 'chờ đợi' thực sự chờ?

async function series() { 
    await wait(500); 
    await wait(500); 
    return "done!"; 
} 

async function parallel() { 
    const wait1 = wait(500); 
    const wait2 = wait(500); 
    await wait1; 
    await wait2; 
    return "done!"; 
} 

function wait(ms) { 
    return new Promise(r => setTimeout(r, ms)); 
} 
+2

Bạn bắt đầu đợi() khi bạn gọi. Trong "loạt" bạn gọi nó và chờ đợi nó, sau đó gọi nó và chờ đợi nó một lần nữa. Trong "song song" bạn gọi hai wait() cùng một lúc, và THEN bạn đang chờ họ. Vì vậy, cả hai đều bắt đầu cùng một lúc. –

+0

@korven không nên 'const wait1 = wait (500);' đã bắt đầu 'setTimeout' trước 'const wait2 = wait (500); 'được thực hiện? – Blake

+0

Tại sao tôi không bao giờ "hoàn thành!" đăng nhập vào giao diện điều khiển Firefox trong khi thực hiện 'series()' hoặc 'parallel()'? – Marecky

Trả lời

6

Trong chức năng đầu tiên của bạn:

async function series() { 
    await wait(500); // 1 
    await wait(500); // 2 
    return "done!"; 
} 

Bạn đang nói JS để chờ đợi sự wait đầu tiên ngay sau khi nó đã bắt đầu.
Điều này có nghĩa thứ hai wait(500) không thể bắt đầu, trước khi là người đầu tiên kết thúc:

  1. Kích hoạt wait(500) // 1
  2. chờ đợi cho rằng để vượt qua
  3. Kích hoạt wait(500) // 2
  4. chờ đợi cho rằng để vượt qua

Trong chức năng thứ hai:

async function parallel() { 
    const wait1 = wait(500); // 1 
    const wait2 = wait(500); // 2 
    await wait1; 
    await wait2; 
    return "done!"; 
} 

Cả hai wait cuộc gọi là bắt đầu, trước khi mã được yêu cầu chờ kết quả.

  1. Kích hoạt wait(500) // 1
  2. Kích hoạt wait(500) // 2
  3. Chờ wait1 để vượt qua,
  4. chờ wait2 để vượt qua

wait1wait2 được kích hoạt ngay lập tức sau mỗi lần khác, họ đang thực tế chạy song song.

Hãy tưởng tượng này:

Nếu 2 người cả hai bắt đầu một đồng hồ bấm giờ cùng một lúc, nếu bạn cần phải chờ đợi trước mỗi đồng hồ bấm giờ đạt đến 10 giây, bạn vẫn chỉ phải chờ 10 giây.
Trong chức năng series, mặt khác, đồng hồ bấm giờ thứ hai không thể bắt đầu trước khi đồng hồ đầu tiên kết thúc.

+0

không nên chờ wait1 = wait (500); đã bắt đầu setTimeout này trước khi const wait2 = wait (500); được thực hiện? – Blake

+0

@Blake: _Start_, vâng. Đầu tiên, 'wait1' được bắt đầu, nhưng nó không chờ đợi' wait1' kết thúc, trước khi _starting_ 'wait2', trong' parallel' – Cerbrus

+0

cảm ơn! chỉ cần kiểm tra lại định nghĩa 'setTimeout', có vẻ như tôi đã trộn nó với settimeinterval .. – Blake

-2

Tùy theo nhiệm vụ không đồng bộ nếu hai tác vụ phụ thuộc hơn chúng tôi phải thực thi chúng theo thứ tự. I E. đợi nhiệm vụ đầu tiên hoàn thành; cùng một điều đang xảy ra trong đoạn đầu tiên đó là lý do tại sao nó mất khoảng 1000ms để hoàn thành.

Nhưng nếu hai nhiệm vụ độc lập, chúng tôi có thể chạy chúng song song và chờ đợi các tác vụ đó trước nhiệm vụ phụ thuộc. I E. trong trường hợp đoạn thứ hai, chúng tôi có thể cần kết quả của cả hai nhiệm vụ và sau đó điều khiển các kết quả này. Đó là lý do tại sao chúng tôi đang chờ trước khi tuyên bố trở lại.

Cơ chế tương tự như C# async-await của nó. Để tham khảo, vui lòng truy cập Asynchronous Programming with async and await

+2

Tại sao bạn liên kết với tài liệu C#? – Cerbrus

+0

@Cerbrus Tôi đang liên kết với tài liệu C# chỉ vì lợi ích của khái niệm vì nó có cơ chế tương tự cho async đang chờ đợi. – Zeeshan

+0

@Cerbrus Nếu bạn so sánh phần khái niệm của câu trả lời của tôi với câu trả lời của bạn, nó truyền đạt ý nghĩa tương tự. Tôi không hiểu tại sao câu trả lời của tôi bị bỏ phiếu. – Zeeshan

Các vấn đề liên quan