Tôi đã thử đọc hướng dẫn và hướng dẫn để không đồng bộ/chờ đợi, nhưng tôi dường như không thể tìm thấy địa chỉ này ở bất cứ đâu.Tại sao mã async/await JavaScript này không hoạt động như mong đợi?
Đây là mã trong câu hỏi:
var func1 = new Promise((resolve, reject) => {
console.log("Func1");
setTimeout(() => {
resolve(10);
}, 100);
});
var func2 = new Promise((resolve, reject) => {
console.log("Func2");
setTimeout(() => {
resolve(20);
}, 5000);
})
let run = async() => {
let var1 = await func1;
let var2 = await func2;
console.log(var1);
console.log(var2);
}
run();
Chúng ta thấy "Func1" và "Func2" được in ngay lập tức, một sau khi khác. 5 giây sau, thời gian chờ được chỉ định trong func2, chúng tôi nhận được bản in "10" và "20". Càng xa càng tốt.
Nhưng nếu tôi thay đổi các bit cuối cùng của mã này:
let run = async() => {
let var1 = await func1;
console.log(var1);
let var2 = await func2;
console.log(var2);
}
Sau đó, tôi nhìn thấy "Func1" ngay lập tức in, nhưng "Func2" là tốt, mặc dù console.log(var1)
đứng trước nó. Sau 100ms đến "10", sau đó sau 5 giây đến "20".
Từ MDN:
Các chờ đợi biểu hiện gây ra chức năng async thực hiện tạm dừng cho đến khi một Promise được hoàn thành hoặc bị từ chối, và để tiếp tục thực hiện các chức năng async sau khi hoàn thành.
Nhưng có vẻ như đây không phải là những gì đang xảy ra. Nếu nó được, chúng ta sẽ không thấy "Func1", sau đó "10", THEN func2 được thực hiện, do đó in "Func2" và 5 giây sau, chúng tôi nhận được "20"? func1 nên được thực hiện, và một khi nó được giải quyết (trong 100 ms), console.log (var1) sẽ kích hoạt. Tôi đang thiếu gì ở đây?
Nó bắt đầu giải quyết khi bạn tạo nó, không phải khi bạn chờ đợi nó –
có thể trùng lặp của [Sử dụng nhiều setTimeout trong cùng một chức năng async/Timer reset ] (https://stackoverflow.com/q/47751923/1048572) – Bergi