Trong một trong những ví dụ dịch vụ Worker bởi Google, cache and return requestsTại sao yêu cầu tìm nạp phải được nhân bản trong nhân viên dịch vụ?
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
// Cache hit - return response
if (response) {
return response;
}
// IMPORTANT: Clone the request. A request is a stream and
// can only be consumed once. Since we are consuming this
// once by cache and once by the browser for fetch, we need
// to clone the response.
var fetchRequest = event.request.clone();
return fetch(fetchRequest).then(
function(response) {
// Check if we received a valid response
if(!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
// IMPORTANT: Clone the response. A response is a stream
// and because we want the browser to consume the response
// as well as the cache consuming the response, we need
// to clone it so we have two streams.
var responseToCache = response.clone();
caches.open(CACHE_NAME)
.then(function(cache) {
cache.put(event.request, responseToCache);
});
return response;
}
);
})
);
});
Mặt khác, ví dụ được cung cấp bởi MDN, Using Service Workers, không sao chép theo yêu cầu.
this.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request).then(function(resp) {
return resp || fetch(event.request).then(function(response) {
caches.open('v1').then(function(cache) {
cache.put(event.request, response.clone());
});
return response;
});
}).catch(function() {
return caches.match('/sw-test/gallery/myLittleVader.jpg');
})
);
});
Vì vậy, trong trường hợp của một cache trong ví dụ của Google:
Tôi hiểu lý do tại sao chúng ta phải sao chép câu trả lời: bởi vì nó được tiêu thụ bởi cache.put
, và chúng tôi vẫn muốn trả lại trả lời lại trang web đã yêu cầu.
Nhưng tại sao người ta phải sao chép yêu cầu? Trong nhận xét, nó cho biết nó được tiêu thụ bởi bộ nhớ cache và trình duyệt để tìm nạp. điều đó có chính xác?
- Vị trí trong bộ nhớ cache là luồng yêu cầu tiêu thụ?
cache.put
? Nếu vậy, tại sao khôngcaches.match
tiêu thụ yêu cầu?
Các đoạn mã trên trang web cơ bản của nhà phát triển web google, khác nhau về triển khai. ví dụ, Jake doen't sao chép yêu cầu [ở đây] (https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#on-network-response) –
@ Schrodinger'scat : Heh, nhưng vẫn nói bên dưới mã đó: * "Để cho phép sử dụng bộ nhớ hiệu quả, bạn chỉ có thể đọc nội dung phản hồi/yêu cầu một lần. Trong đoạn mã trên, .clone() được sử dụng để tạo các bản sao bổ sung có thể đọc riêng . "* (lưu ý *" ... phản hồi/yêu cầu của cơ thể một lần ... "*). Tôi thực sự không thể nói từ thông số kỹ thuật của nhân viên dịch vụ, trong vài phút tôi đã cho nó, cho dù bạn có cần hay không. Tôi đoán là bạn làm, * nếu * cơ thể của yêu cầu là một luồng. Tôi có thể thử nghiệm nó để chắc chắn (và thậm chí sau đó, tôi thực sự chỉ biết nếu nó * thất bại *). –
hmm .. tốt hơn là thông số của nhân viên dịch vụ, tôi đoán điều này có thể được ghi lại trong thông số cache hoặc lấy thông số api spec .. cần đọc –