Tôi có một kịch bản mà tôi đang trả lời lời hứa. Lời hứa về cơ bản đưa ra phản hồi của yêu cầu ajax.điều gì sẽ xảy ra nếu chúng tôi không giải quyết hoặc từ chối lời hứa
Khi từ chối lời hứa, nó hiển thị hộp thoại báo lỗi có lỗi máy chủ.
Điều tôi muốn làm là khi mã phản hồi là 401, tôi không muốn giải quyết lời hứa cũng như không từ chối lời hứa (vì nó hiển thị hộp thoại báo lỗi). Tôi chỉ muốn chuyển hướng đến trang đăng nhập.
Mã của tôi trông giống như sau
function makeRequest(ur,params) {
return new Promise(function(resolve,reject) {
fetch(url,params)
.then((response) => {
let status = response.status;
if (status >= 200 && status < 300) {
response.json().then((data) => {
resolve(data);
})
}
else {
if(status === 401) {
redirectToLoginPage();
}
else {
response.json().then((error) => {
if (!error.message) {
error.message = constants.SERVER_ERROR;
}
reject({status,error});
})
}
}
})
});
}
Như bạn có thể thấy nếu tình trạng này là 401, tôi đang chuyển hướng đến trang đăng nhập. Lời hứa không được giải quyết hay từ chối.
Mã này có ổn không? Hoặc có cách nào tốt hơn để thực hiện việc này không.
Cảm ơn.
Như bạn đã đề cập, chuyển hướng đến trang trình duyệt mới sẽ xóa hoàn toàn trạng thái trang hiện tại (bao gồm tất cả trạng thái Javascript). Nhưng điều gì sẽ xảy ra nếu tôi đang chuyển hướng trong một ứng dụng trang đơn lẻ. Tôi đang sử dụng ReactJS. Vì vậy, sẽ không có trang trình duyệt mới, chỉ là một chế độ xem khác. Cho dù đó là hoàn toàn tốt đẹp để có một phím tắt trong trường hợp đó với chuyển hướng và chỉ để lại những thứ khác chưa được giải quyết. – Aniket
@Aniket - Sau đó, đó là một trường hợp khác mà câu hỏi của bạn không mô tả. Bạn sẽ phải đảm bảo mọi thứ được làm sạch đúng cách để bạn không bị rò rỉ bộ nhớ. Tôi không biết liệu sẽ có vấn đề với điều này trong phản ứng hay không. Lần tới hãy đặt loại thông tin này vào câu hỏi của bạn. – jfriend00
Đảm bảo bạn không có tham chiếu đến các hàm 'reject' và' resolve', và không chỉ dừng tham chiếu lời hứa. Sau đó, GC nên bước vào. Nếu không, nếu mã của bạn vẫn tham chiếu 'giải quyết' chẳng hạn, thì Lời hứa sẽ phải tuân thủ trong trường hợp mã của bạn từng gọi' resolve() '. Dưới đây là ví dụ về API Web có thể bị rò rỉ Promises nếu không cẩn thận: https://github.com/w3c/webcomponents/issues/674 – trusktr