Tôi đang gặp khó khăn khi hiểu javaScript promises
. Tôi đã viết đoạn mã sau:
var p = new Promise(function(resolve,reject){
reject(Error("hello world"));
});
setTimeout(()=>p.catch(e=>console.log(e)),5000);
Tôi ngay lập tức thấy điều này trong bảng điều khiển dành cho nhà phát triển Chrome của mình:
Nhưng sau khi tôi đợi 5 giây, tin nhắn sẽ tự động chuyển sang màu đen như hình ảnh này:
Tôi chưa bao giờ thấy hành vi này trước đây giữa mã javaScript của tôi và bảng điều khiển dành cho nhà phát triển, nơi mã javaScript của tôi có thể "sửa đổi nội dung hiện có" trong bảng điều khiển dành cho nhà phát triển.
Vì vậy, tôi quyết định xem liệu tình huống tương tự có xảy ra với resolve
việc viết mã này không:
var p = new Promise(function(resolve,reject){
resolve("hello world");
});
setTimeout(()=>p.then(e=>console.log(e)),5000);
Nhưng trong tình huống này, bảng điều khiển dành cho nhà phát triển của tôi không hiển thị bất cứ điều gì cho đến 5 giây sau, sau đó nó sẽ được in hello world
.
Tại sao resolve
và reject
được đối xử rất khác nhau về thời điểm chúng được viện dẫn?
THÊM
Tôi cũng đã viết mã này:
var p = new Promise(function(resolve,reject){
reject(Error("hello world"));
});
setTimeout(()=>p.catch(e=>console.log("errors",e)),5000);
setTimeout(()=>p.catch(e=>console.log("errors 2",e)),6000);
setTimeout(()=>p.catch(null),7000);
Điều này gây ra một số kết quả đầu ra cho bảng điều khiển dành cho nhà phát triển. Lỗi đỏ ở thời điểm 0, đỏ chuyển sang đen ở thời điểm 5 giây với văn bản errors hello world
, sau đó là thông báo lỗi mới tại thời điểm 6 giây errors 2 hello world
, sau đó là thông báo lỗi đỏ ở thời điểm 7 giây. Bây giờ tôi rất bối rối về số lần reject
thực sự được gọi .... Tôi bị mất ...
var p = new Promise(function(resolve,reject){ reject(Error("hello world")); });
có thể được viết thành ngữ và chính xác hơn như sauvar p = Promise.reject(Error("hello world"));
:-)