Bạn đang sử dụng hiệu quả các hứa hẹn bên trong hàm thực thi phương thức khởi tạo hứa, vì vậy đây là mẫu phản phương thức khởi tạo Promise .
Mã của bạn là một ví dụ điển hình về rủi ro chính: không phổ biến tất cả các lỗi một cách an toàn. Đọc tại sao ở đó .
Ngoài ra, việc sử dụng async
/ await
có thể làm cho những cái bẫy giống nhau thậm chí còn đáng ngạc nhiên hơn. So sánh:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
với async
tương đương ngây thơ (sai) :
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
Tìm bảng điều khiển web của trình duyệt của bạn để biết bảng điều khiển cuối cùng.
Cách đầu tiên hoạt động vì bất kỳ ngoại lệ ngay lập tức nào trong hàm thực thi của phương thức khởi tạo Promise sẽ từ chối một cách thuận tiện lời hứa mới được xây dựng (nhưng bên trong bất kỳ ngoại lệ nào .then
mà bạn tự làm).
Cái thứ hai không hoạt động bởi vì bất kỳ ngoại lệ tức thời nào trong một async
hàm đều từ chối lời hứa ngầm được trả về bởi async
chính hàm .
Vì giá trị trả về của một hàm thực thi phương thức khởi tạo hứa không được sử dụng, đó là tin xấu!
Ma cua ban
Không có lý do gì bạn không thể định nghĩa myFunction
là async
:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
}, error => {
if (error) return reject(error);
});
});
}
Mặc dù tại sao lại sử dụng các thư viện điều khiển đồng thời lỗi thời khi bạn có await
?