54

In Javascript, when is this error thrown?

enter image description here

index.js

/**
 * Created by tushar.mathur on 24/12/15.
 */
'use strict'

const _ = require('lodash')
const Rx = require('rx')
const createDataStore = require('./src/createDataStore')

const fetch = x => Rx.Observable.fromPromise(window.fetch(x)) 
const parseJSON = x => Rx.Observable.fromPromise(x.json()) // Line: 11 (Where the exception is thrown)
var create = _.partial(createDataStore, fetch, parseJSON)
module.exports = {
  create,
  // Alias for legacy purposes
  createDataStore: create,
  createFetchStore: create
}

Is it a native promise error? What does it imply? Google shows no result found.

tusharmath
  • 9,120
  • 11
  • 52
  • 70

2 Answers2

81

I think it means that the body has already been read by using either .json() .text() etc... When you run x.json() it takes the response's body and reads it into JSON. If you try to run x.json() again it will give you that error. So you could only use one of these methods once. So I am assuming somewhere in your code it is reading the body of the same response again using one of the Body methods.

I think that is why they offer the Body.bodyUsed method. So you can see if it has been read already.

gkkirsch
  • 1,696
  • 1
  • 14
  • 14
  • 8
    Solution if you really need to read 2x times: use response.clone() https://github.com/whatwg/fetch/issues/196#issuecomment-171935172 – Offirmo Apr 02 '18 at 12:22
10

This error means you have resolved the promise (in this case, you use Body.json()) more than once.

You can check the response body methods from the ref I attached below and you need a flag to check if the promise has been resolved or not: in this case, you can use Body.bodyUsed

Reference: https://developer.mozilla.org/en-US/docs/Web/API/Response

HTH

Winters
  • 603
  • 9
  • 15
  • 1
    I've just run into this error too. You don't need to resolve the promise twice, which should be impossible anyway without fiddling with internal properties of the promise. You only have to call `.then()` on it twice. It's documented that calling `.then()` twice is supported. I'll see if I can boil down a minimal example. My code displaying this is here: https://tonicdev.com/hippietrail/57611741f056621300ecd1e2 – hippietrail Jun 15 '16 at 13:06