- From: Jan Jaap <notifications@github.com>
- Date: Wed, 05 Jul 2017 21:50:50 +0000 (UTC)
- To: whatwg/fetch <fetch@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/fetch/issues/447/313236964@github.com>
It is possible to cancel a Fetch request using a Fetch stream reader. The following example is a quick draft that appears to work well in browsers that support Fetch Streams (the request is aborted after a few bytes of transfer). ```javascript var fetch = (function() { var fetch = window.fetch; var cancelableFetch = function() { var reader; var cancelled = false; var request = fetch.apply(this, arguments).then(function(response) { reader = response.body.getReader(); if (cancelled) { // abort stream reader.cancel(); return null; } var body = ''; var decoder = new TextDecoder(); function readStream() { return reader.read().then(function(result) { if (cancelled) { return null; } body += decoder.decode(result.value || new Uint8Array, { stream: !result.done }); if (cancelled) { return null; } if (result.done) { return body; } return readStream(); }) } return readStream(); }); var cancel = function() { if (cancelled) { return; } cancelled = true; console.warn('Fetch aborted'); if (!reader) { return; } // abort stream reader.cancel(); }; return { then: function(resolve) { return request.then(resolve); }, cancel: cancel }; }; return cancelableFetch; })(); // reqular fetch request var request = fetch('https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js'); // regular processing of result request.then(function(body) { console.log("Fetch complete:", (typeof body === 'string') ? body.length : body); }).catch(function(err) { console.log(err.message); }); // cancel request request.cancel(); ``` Demo: https://jsfiddle.net/4awe08ob/ https://jakearchibald.com/2015/thats-so-fetch/#streams -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/fetch/issues/447#issuecomment-313236964
Received on Wednesday, 5 July 2017 21:51:56 UTC