(代码来自https://redux.js.org/advanced/async-actions)
代码设置一个redux存储,然后通过一些操作调用存储上的调度。商店使用redux-thunk来管理异步API调用。
这是index.js
import reduxThunk from 'redux-thunk'
const { thunkMiddleware } = reduxThunk;
import redux from 'redux';
const { createStore } = redux;
const { applyMiddleware } = redux;
import { selectSubreddit, fetchPosts } from './actions.js'
import rootReducer from './reducers.js'
const store = createStore(
rootReducer,
applyMiddleware(thunkMiddleware)
);
store.dispatch(selectSubreddit('reactjs'));
store.dispatch(fetchPosts('reactjs')).then(() => console.log(store.getState()));
运行node index.js
后出错
(node:19229) ExperimentalWarning: The ESM module loader is experimental.
applyMiddleware [Function: applyMiddleware]
/home/code/redux/tutorial_async_actions/node_modules/redux/lib/redux.js:648
return middleware(middlewareAPI);
^
TypeError: middleware is not a function
at /home/code/redux/tutorial_async_actions/node_modules/redux/lib/redux.js:648:16
at Array.map (<anonymous>)
at /home/code/redux/tutorial_async_actions/node_modules/redux/lib/redux.js:647:31
at createStore (/home/code/redux/tutorial_async_actions/node_modules/redux/lib/redux.js:85:33)
at file:///home/code/redux/tutorial_async_actions/index.js:18:15
at ModuleJob.run (internal/modules/esm/module_job.js:110:37)
at async Loader.import (internal/modules/esm/loader.js:164:24)
,我该怎么做才能让它运行呢?,我认为这与ES6和模块有关,但我被困住了……:(
我已经在这么做了(正如这个答案所建议的)
import redux from 'redux';
const { createStore, applyMiddleware } = redux;
(我可以用创建-反应-应用程序让这个工作.但我更愿意在没有webpack等人的情况下完成这项工作。
下面是供参考的剩余代码。
在这里的行动
export const SELECT_SUBREDDIT = 'SELECT_SUBREDDIT'
export function selectSubreddit(subreddit) {
return {
type: SELECT_SUBREDDIT,
subreddit
};
}
export const INVALIDATE_SUBREDDIT = 'INVALIDATE_SUBREDDIT'
function invalidateSubreddit(subreddit) {
return {
type: INVALIDATE_SUBREDDIT,
subreddit
};
}
export const REQUEST_POSTS = 'REQUEST_POSTS'
function requestPosts(subreddit) {
return {
type: REQUEST_POSTS,
subreddit
}
}
export const RECEIVE_POSTS = 'RECEIVE_POSTS'
function receivePosts(subreddit, json) {
return {
type: RECEIVE_POSTS,
subreddit,
posts: json.data.children.map(child => child.data),
receivedAt: Date.now()
}
}
export function fetchPosts(subreddit) {
return function (dispatch) {
dispatch(requestPosts(subreddit));
return fetch(`https://www.reddit.com/r/${subreddit}.json`)
.then(
response => response.json(),
error => console.log('An error occurred.', error)
)
.then(json =>
dispatch(receivePosts(subreddit, json))
)
}
}
这里是减速机
import redux from 'redux';
const { combineReducers } = redux;
import {
SELECT_SUBREDDIT,
INVALIDATE_SUBREDDIT,
REQUEST_POSTS,
RECEIVE_POSTS
} from './actions.js';
function selectedSubreddit(state = 'reactjs', action) {
switch (action.type) {
case SELECT_SUBREDDIT:
return action.subreddit
default:
return state
}
}
function posts(
state = {
isFetching: false,
didInvalidate: false,
items: []
},
action
) {
switch (action.type) {
case INVALIDATE_SUBREDDIT:
return Object.assign({}, state, { didInvalidate: true })
case REQUEST_POSTS:
return Object.assign({}, state, { isFetching: true, didInvalidate: false });
case RECEIVE_POSTS:
return Object.assign({}, state, {
isFetching: false, didInvalidate: false,
items: action.posts,
lastUpdated: action.receivedAt
});
default:
return state;
}
}
function postsBySubreddit(state = {}, action) {
switch (action.type) {
case INVALIDATE_SUBREDDIT:
case RECEIVE_POSTS:
case REQUEST_POSTS:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
});
default:
return state
}
}
const rootReducer = combineReducers({
postsBySubreddit,
selectedSubreddit
});
export default rootReducer;
在这里package.json
{
"name": "redux_async_actions",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"type": "module",
"dependencies": {
"redux": "^4.0.5",
"redux-thunk": "^2.3.0"
}
}
发布于 2020-02-24 04:32:31
(我最初问的是这个问题,但我的登录失败了)
我使用节点模块系统 (即使用所需的函数)来完成这个任务。ES6导出/导入应该可以工作,但我想我尝试使用的模块(redux、redux)中的一个模块与ES6导出/导入操作不太好。
本质上,我将export
语句转换为exports.
语句
export function(...) {...}
=> exports.myFunction = function(...) {...}
我将import
语句转换为require
语句。
import {myFunction} from './somefile.js'
=> const module = require('./somefile.js')
在下面的代码中,如问题中所示,但使用了require。
index.js
const redux = require('redux');
const { createStore, applyMiddleware } = redux;
const ReduxThunk = require('redux-thunk').default
const actions = require('./actions.js');
const { selectSubreddit, fetchPosts } = actions;
const rootReducer = require('./reducers.js');
const store = createStore(
rootReducer.rootReducer,
applyMiddleware(ReduxThunk)
);
store.dispatch(selectSubreddit('reactjs'));
store.dispatch(fetchPosts('reactjs')).then(() => console.log(store.getState()));
actions.js
const fetch = require('cross-fetch');
const SELECT_SUBREDDIT = 'SELECT_SUBREDDIT'
exports.SELECT_SUBREDDIT = SELECT_SUBREDDIT
function selectSubreddit(subreddit) {
return {
type: SELECT_SUBREDDIT,
subreddit
};
}
exports.selectSubreddit = selectSubreddit;
const INVALIDATE_SUBREDDIT = 'INVALIDATE_SUBREDDIT'
exports.INVALIDATE_SUBREDDIT = INVALIDATE_SUBREDDIT
function invalidateSubreddit(subreddit) {
return {
type: INVALIDATE_SUBREDDIT,
subreddit
};
}
const REQUEST_POSTS = 'REQUEST_POSTS'
exports.REQUEST_POSTS = REQUEST_POSTS
function requestPosts(subreddit) {
return {
type: REQUEST_POSTS,
subreddit
}
}
const RECEIVE_POSTS = 'RECEIVE_POSTS'
exports.RECEIVE_POSTS = RECEIVE_POSTS
function receivePosts(subreddit, json) {
return {
type: RECEIVE_POSTS,
subreddit,
posts: json.data.children.map(child => child.data),
receivedAt: Date.now()
}
}
function fetchPosts(subreddit) {
return function (dispatch) {
dispatch(requestPosts(subreddit));
return fetch(`https://www.reddit.com/r/${subreddit}.json`)
.then(
response => response.json(),
error => console.log('An error occurred.', error)
)
.then(json =>
dispatch(receivePosts(subreddit, json))
)
}
}
exports.fetchPosts = fetchPosts;
reducers.js
const redux = require('redux');
const { combineReducers } = redux;
const actions = require('./actions.js');
const {
SELECT_SUBREDDIT,
INVALIDATE_SUBREDDIT,
REQUEST_POSTS,
RECEIVE_POSTS
} = actions;
function selectedSubreddit(state = 'reactjs', action) {
switch (action.type) {
case SELECT_SUBREDDIT:
return action.subreddit
default:
return state
}
}
function posts(
state = {
isFetching: false,
didInvalidate: false,
items: []
},
action
) {
switch (action.type) {
case INVALIDATE_SUBREDDIT:
return Object.assign({}, state, { didInvalidate: true })
case REQUEST_POSTS:
return Object.assign({}, state, { isFetching: true, didInvalidate: false });
case RECEIVE_POSTS:
return Object.assign({}, state, {
isFetching: false, didInvalidate: false,
items: action.posts,
lastUpdated: action.receivedAt
});
default:
return state;
}
}
function postsBySubreddit(state = {}, action) {
switch (action.type) {
case INVALIDATE_SUBREDDIT:
case RECEIVE_POSTS:
case REQUEST_POSTS:
return Object.assign({}, state, {
[action.subreddit]: posts(state[action.subreddit], action)
});
default:
return state
}
}
const rootReducer = combineReducers({
postsBySubreddit,
selectedSubreddit
});
exports.rootReducer = rootReducer;
package.json (通知包没有"type": "module",
)
{
"name": "basic_example_only_node",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"cross-fetch": "^3.0.4",
"redux": "^4.0.5",
"redux-thunk": "^2.3.0"
}
}
https://stackoverflow.com/questions/60363308
复制相似问题