FetchEvent: phương thức respondWith()
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2018.
* Some parts of this feature may have varying levels of support.
Note: This feature is only available in Service Workers.
Phương thức respondWith() của FetchEvent ngăn chặn xử lý tìm nạp mặc định của trình duyệt, và cho phép bạn tự cung cấp promise cho Response.
Trong hầu hết các trường hợp, bạn có thể cung cấp bất kỳ phản hồi nào mà bên nhận hiểu được. Ví dụ, nếu <img> khởi tạo yêu cầu, phần thân phản hồi cần là dữ liệu hình ảnh. Vì lý do bảo mật, có một số quy tắc toàn cục:
- Bạn chỉ có thể trả về các đối tượng
Responsecótypelà"opaque"nếu đối tượngfetchEvent.requestcómodelà"no-cors". Điều này ngăn rò rỉ dữ liệu riêng tư. - Bạn chỉ có thể trả về các đối tượng
Responsecótypelà"opaqueredirect"nếu đối tượngfetchEvent.requestcómodelà"manual". - Bạn không thể trả về các đối tượng
Responsecótypelà"cors"nếu đối tượngfetchEvent.requestcómodelà"same-origin".
Cú pháp
respondWith(response)
Tham số
Giá trị trả về
Không có (undefined).
Ngoại lệ
NetworkErrorDOMException-
Được trả về nếu lỗi mạng được kích hoạt trên một số kết hợp nhất định của các giá trị
FetchEvent.request.modevàResponse.type, như được gợi ý trong các "quy tắc toàn cục" liệt kê ở trên. InvalidStateErrorDOMException-
Được trả về nếu sự kiện chưa được gửi hoặc
respondWith()đã được gọi.
Mô tả
>Chỉ định URL cuối cùng của tài nguyên
Từ Firefox 59 trở đi, khi một service worker cung cấp Response cho FetchEvent.respondWith(), giá trị Response.url sẽ được truyền đến yêu cầu mạng bị chặn như là URL đã giải quyết cuối cùng. Nếu giá trị Response.url là chuỗi rỗng, thì FetchEvent.request.url được dùng làm URL cuối cùng.
Trước đây FetchEvent.request.url được dùng làm URL cuối cùng trong mọi trường hợp. Response.url được cung cấp thực tế bị bỏ qua.
Điều này có nghĩa là, ví dụ, nếu một service worker chặn stylesheet hoặc worker script, thì Response.url được cung cấp sẽ được dùng để giải quyết bất kỳ tải tài nguyên con @import hoặc importScripts() tương đối nào (Firefox bug 1222008).
Đối với hầu hết các loại yêu cầu mạng, thay đổi này không có tác động vì bạn không thể quan sát URL cuối cùng. Tuy nhiên có một số trường hợp quan trọng:
- Nếu
fetch()bị chặn, bạn có thể quan sát URL cuối cùng trênResponse.urlcủa kết quả. - Nếu script worker bị chặn, URL cuối cùng được dùng để đặt
self.locationvà được dùng làm URL cơ sở cho các URL tương đối trong worker script. - Nếu stylesheet bị chặn, URL cuối cùng được dùng làm URL cơ sở để giải quyết các tải
@importtương đối.
Lưu ý rằng các yêu cầu điều hướng cho Windows và iframes KHÔNG dùng URL cuối cùng. Cách mà đặc tả HTML xử lý các chuyển hướng điều hướng dùng URL yêu cầu cho Window.location kết quả. Điều này có nghĩa là các trang web vẫn có thể cung cấp "chế độ xem thay thế" của trang web khi ngoại tuyến mà không thay đổi URL hiển thị cho người dùng.
Ví dụ
Sự kiện fetch này cố trả về phản hồi từ API bộ nhớ đệm, dùng mạng nếu không thành công.
addEventListener("fetch", (event) => {
// Ngăn chặn mặc định và tự xử lý yêu cầu.
event.respondWith(
(async () => {
// Cố lấy phản hồi từ bộ nhớ đệm.
const cachedResponse = await caches.match(event.request);
// Trả về nếu tìm thấy.
if (cachedResponse) return cachedResponse;
// Nếu không tìm thấy kết quả khớp trong bộ nhớ đệm, dùng mạng.
return fetch(event.request);
})(),
);
});
Note:
caches.match() là phương thức tiện ích. Chức năng tương đương là gọi cache.match() trên mỗi bộ nhớ đệm (theo thứ tự được trả về bởi caches.keys()) cho đến khi Response được trả về.
Thông số kỹ thuật
| Specification |
|---|
| Service Workers Nightly> # fetch-event-respondwith> |