2017-10-31 21 views
5

Tài liệu MDN cho async function hiện cung cấp ví dụ kết hợp sau đây về hai cách để sử dụng await. Tôi đã sắp xếp lại nó chỉ một chút để nhấn mạnh:Khi nào 'chờ đợi' được giải quyết đồng thời?

function resolveAfter2Seconds(x) { 
    return new Promise(resolve => { 
    setTimeout(() => { 
     resolve(x); 
    }, 2000); 
    }); 
} 


async function add1(x) { 
    const a = await resolveAfter2Seconds(20); 
    const b = await resolveAfter2Seconds(30); 
    return x + a + b; 
} 

async function add2(x) { 
    const p_a = resolveAfter2Seconds(20); 
    const p_b = resolveAfter2Seconds(30); 
    return x + await p_a + await p_b; 
} 


add1(10).then(v => { 
    console.log(v); // prints 60 after 4 seconds. 
}); 

add2(10).then(v => { 
    console.log(v); // prints 60 after 2 seconds. 
}); 

Điều này thật đáng ngạc nhiên đối với tôi. Tại sao

const a = await resolveAfter2Seconds(20); 
const b = await resolveAfter2Seconds(30); 
return x + a + b; 

quyết hai hứa hẹn liên tục, trong khi

return x + await p_a + await p_b; 

dường như giải quyết hai hứa hẹn cùng một lúc? Hành vi này có được chỉ định cho await cụ thể hoặc hậu quả tự nhiên của một thứ khác không?

+0

Cảm ơn, tôi muốn một tài liệu tham khảo với một chút quy tắc cụ thể hơn cho điều này, mặc dù. Ví dụ. rõ ràng là "dòng" là một sự đơn giản hóa ở đây, mặc dù có lẽ nó phải làm với các câu lệnh mức độ ngôn ngữ? – natevw

+0

'Một hàm có nhiều biểu thức đang đợi trong nó sẽ bị treo một lần tại một thời điểm trên mỗi biểu thức chờ đợi cho đến khi Lời hứa đó được giải quyết, trước khi thực hiện không mong muốn và chuyển sang biểu thức chờ đợi tiếp theo - không giống như trường hợp chúng ta quan sát với máy phát và năng suất. Nguồn: https://ponyfoo.com/articles/understanding-javascript-async-await – Dez

+0

@Dez Hmm, nhưng sau đó làm cách nào bạn giải thích hành vi KHÔNG "một lần tại một thời điểm" khi có nhiều câu lệnh đang chờ xuất hiện trong một biểu thức duy nhất /tuyên bố/___? – natevw

Trả lời

7
async function add2(x) { 
    const p_a = resolveAfter2Seconds(20); 
    const p_b = resolveAfter2Seconds(30); 
    return x + await p_a + await p_b; 
} 

Trong này p_a tuyên bố và p_b được khởi động song song (ví dụ, ngay sau khi bạn tạo ra các lời hứa), vì vậy khi bạn đang chờ đợi p_a và p_b họ sẽ xuất hiện song song, không phải tuần tự.

Để có được các chức năng khác (đang chờ đợi trong loạt), bạn sẽ cần phải:

return x + await resolveAfter2Seconds(20) + await resolveAfter2Seconds(30); 
+0

Ah, có ý nghĩa hoàn hảo ngay bây giờ :-) Nó có mọi thứ cần làm khi đánh giá của cuộc gọi hàm async xảy ra, thay vì bất cứ điều gì liên quan đến cú pháp/ngữ cảnh của các câu lệnh chờ đợi. Cảm ơn! – natevw

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