Re: [whatwg/fetch] Question — Why can I not read the stream again ? (#196)

Here's a way that you can work around. Basically, you just build off an object containing `response` and `body` to next callbacks. This way you just read the Stream once, and you keep both variables in your scope. I do not know much about performance costs of this implementation, but so far, it never failed me 👍 

```
class Api {

  constructor() {
      this.domain = 'http://localhost:5000';
  }

  fetch({url, body, headers = {}, onResponse = () => {}, onSuccess = () => {},
    onError = () => {}, authenticated = false}) {

    if(authenticated === true){
      headers["Authorization"] =
        "some authorization token here";
    }

    return fetch(this.domain.concat(url), { body: body, headers: headers })
    .then((response) => {
      return response.json().then((body) => {
        return { response, body };
      })
      .then((request) => {
        this.checkAuthentication(request, authenticated);
      })
      .then((request) => {
        this.handleCallbacks(request, onResponse, onSuccess, onError);
      });
    });
  }

  checkAuthentication(request, authenticated){
    if(authenticated === true && request.response.status === 401){
      // STUB
    }
  }

  handleCallbacks(request, onResponse, onSuccess, onError){
    console.log(onResponse);
      onResponse(request.response, request.body);
      (request.response.status < 200 || request.response.status >= 300) ?
       onError(request.response, body):
       onSuccess(request.response, body);
  }

}

export default Api;
```

As you can see you can access both `response` and `body` from completely external methods. Anonymous functions to pass parameters out to external methods may seem a bit overkill at first, but haven't found a better solution atm.

Hope this helps :)

-- 
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/196#issuecomment-309703601

Received on Tuesday, 20 June 2017 09:51:46 UTC