I’m currently toying with thunks vs Sagas.
The idea of re-writing a significant portion of my app’s API connectivity (from thunk, to saga) is not entirely thrilling. However, sagas do appear to be the better solution given what I currently know, and would choose them if starting again from scratch.
The gist of my problem is that thunks have added in a layer of complexity – but they work.
For any API call that should be authenticated, I need to catch the call using a middleware and then add the necessary token, and so on.
Combine this with Redux Form, however, and I am left with a bit of a head-scratcher. This middleware is generic. If certain calls fail, I need to map the response (containing error messages) to an object that Redux Form understands, then dispatch the stopSubmit action.
Anyway, enough about my problem.
Before making the switch I found a potential solution that involves using async / await. Being a sucker for new and shiny, I wanted to get it into my project.
Simply trying to use async / await resulted in an error for me:
Uncaught ReferenceError: regeneratorRuntime is not defined
Boo.
To fix this, I needed to import the babel-polyfill. However, a thing I found out is that you can import this dependency once in one of your top level components, rather than per file.
For example, in my project I have an App component which contains a container which all other components in the app render into.
I added the single line:
import "babel-polyfill";
as the first line in the file, and nowasync / await works just fine.
These other two files may help in setting up:
"devDependencies": {
"babel-cli": "6.14.0",
"babel-core": "6.14.0",
"babel-es6-polyfill": "1.1.0",
"babel-jest": "16.0.0",
"babel-loader": "6.2.5",
"babel-plugin-react-display-name": "2.0.0",
"babel-plugin-transform-async-to-generator": "6.8.0",
"babel-plugin-transform-react-constant-elements": "6.9.1",
"babel-plugin-transform-react-remove-prop-types": "0.2.9",
"babel-preset-es2015": "6.16.0",
"babel-preset-latest": "6.14.0",
"babel-preset-react": "6.11.1",
"babel-preset-react-hmre": "1.1.1",
"babel-preset-stage-1": "6.13.0",
"babel-register": "6.14.0",
{
"presets": [
"latest",
"react",
"stage-1"
]
}