Wrapping fetch(), preserve promise-based API for outer function
but am not sure if that applies here. And, is it necessary to return
  the result wrapped in a new promise, at all?


Yes, that applies here. 

No, returning Promise.resolve() is not necessary. .then() returns a new Promise object. Use 

return result

within the function passed to .then().

Note, a value returned from .catch() results in a resolved Promise. Depending on how errors are handled an error could be thrown (withing {} of a function).

this.fetchCalendarData(0, 6).then((fetched_calendar_data) =&gt; {
    this.calendar_data = fetched_calendar_data;
});


should include the second parameter to .then() to handle potential error

.then((fetched_calendar_data)=&gt;{}, err=&gt;{/* handle error */})


given then Promise.reject() is returned from .catch(), or .catch() should be chained to .then()

.then((fetched_calendar_data)=&gt;{}
.catch(err=&gt;{/* handle error */})




fetchCalendarData(offset, length) {
  return fetch(this.props.Uri + '?offset=' + offset + '&amp;length=' + length)
  .then(response =&gt; response.json())
  .then(result =&gt; {
    if (result.hasOwnProperty('redirect_to_login') 
       &amp;&amp; result.redirect_to_login == true) {
         window.location.reload(window.globalAppState.base_url + "/login");
    }
    return result;
  })
  .catch(() =&gt; {
    throw new Error('FAILURE');
  });
}

this.fetchCalendarData(0, 6)
.then(fetched_calendar_data =&gt; {
  this.calendar_data = fetched_calendar_data;
})
.catch(err =&gt; console.error(err));