[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-3078":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":16,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":22,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":28,"readmeContent":29,"aiSummary":30,"trendingCount":15,"starSnapshotCount":15,"syncStatus":17,"lastSyncTime":31,"discoverSource":32},3078,"redux-saga","redux-saga\u002Fredux-saga","An alternative side effect model for Redux apps","https:\u002F\u002Fredux-saga.js.org\u002F",null,"JavaScript",22448,1936,239,23,0,1,2,70.56,"MIT License",false,"main",true,[24,25,26,5,27],"effects","middleware","redux","sagas","2026-06-12 04:00:16","\u003Cimg src='https:\u002F\u002Fredux-saga.js.org\u002Fimg\u002FRedux-Saga-Logo-Landscape.png' alt='Redux Logo Landscape' width='800px'>\n\n# redux-saga\n\n[![npm version](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fredux-saga.svg)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fredux-saga)\n[![CDNJS](https:\u002F\u002Fimg.shields.io\u002Fcdnjs\u002Fv\u002Fredux-saga.svg)](https:\u002F\u002Fcdnjs.com\u002Flibraries\u002Fredux-saga)\n[![npm](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002Fredux-saga.svg)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fredux-saga)\n[![Discord Shield](https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F740090768164651008?label=discord&logo=discord)](https:\u002F\u002Fdiscord.gg\u002FAKz29HvK2h)\n[![OpenCollective](https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbackers\u002Fbadge.svg)](#backers)\n[![OpenCollective](https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsors\u002Fbadge.svg)](#sponsors)\n\n`redux-saga` is a library that aims to make application side effects (i.e. asynchronous things like data fetching and impure things like accessing the browser cache) easier to manage, more efficient to execute, easy to test, and better at handling failures.\n\nThe mental model is that a saga is like a separate thread in your application that's solely responsible for side effects. `redux-saga` is a redux middleware, which means this thread can be started, paused and cancelled from the main application with normal redux actions, it has access to the full redux application state and it can dispatch redux actions as well.\n\nIt uses an ES6 feature called Generators to make those asynchronous flows easy to read, write and test. _(if you're not familiar with them [here are some introductory links](https:\u002F\u002Fredux-saga.js.org\u002Fdocs\u002FExternalResources.html))_ By doing so, these asynchronous flows look like your standard synchronous JavaScript code. (kind of like `async`\u002F`await`, but generators have a few more awesome features we need)\n\nYou might've used `redux-thunk` before to handle your data fetching. Contrary to redux thunk, you don't end up in callback hell, you can test your asynchronous flows easily and your actions stay pure.\n\n# Getting started\n\n## Install\n\n```sh\n$ npm install redux-saga\n```\n\nor\n\n```sh\n$ yarn add redux-saga\n```\n\nAlternatively, you may use the provided UMD builds directly in the `\u003Cscript>` tag of an HTML page. See [this section](#using-umd-build-in-the-browser).\n\n## Usage Example\n\nSuppose we have a UI to fetch some user data from a remote server when a button is clicked. (For brevity, we'll just show the action triggering code.)\n\n```javascript\nclass UserComponent extends React.Component {\n  ...\n  onSomeButtonClicked() {\n    const { userId, dispatch } = this.props\n    dispatch({type: 'USER_FETCH_REQUESTED', payload: {userId}})\n  }\n  ...\n}\n```\n\nThe Component dispatches a plain Object action to the Store. We'll create a Saga that watches for all `USER_FETCH_REQUESTED` actions and triggers an API call to fetch the user data.\n\n#### `sagas.js`\n\n```javascript\nimport { call, put, takeEvery, takeLatest } from 'redux-saga\u002Feffects'\nimport Api from '...'\n\n\u002F\u002F worker Saga: will be fired on USER_FETCH_REQUESTED actions\nfunction* fetchUser(action) {\n  try {\n    const user = yield call(Api.fetchUser, action.payload.userId)\n    yield put({ type: 'USER_FETCH_SUCCEEDED', user: user })\n  } catch (e) {\n    yield put({ type: 'USER_FETCH_FAILED', message: e.message })\n  }\n}\n\n\u002F*\n  Starts fetchUser on each dispatched `USER_FETCH_REQUESTED` action.\n  Allows concurrent fetches of user.\n*\u002F\nfunction* mySaga() {\n  yield takeEvery('USER_FETCH_REQUESTED', fetchUser)\n}\n\n\u002F*\n  Alternatively you may use takeLatest.\n\n  Does not allow concurrent fetches of user. If \"USER_FETCH_REQUESTED\" gets\n  dispatched while a fetch is already pending, that pending fetch is cancelled\n  and only the latest one will be run.\n*\u002F\nfunction* mySaga() {\n  yield takeLatest('USER_FETCH_REQUESTED', fetchUser)\n}\n\nexport default mySaga\n```\n\nTo run our Saga, we'll have to connect it to the Redux Store using the `redux-saga` middleware.\n\n#### `main.js`\n\n```javascript\nimport { createStore, applyMiddleware } from 'redux'\nimport createSagaMiddleware from 'redux-saga'\n\nimport reducer from '.\u002Freducers'\nimport mySaga from '.\u002Fsagas'\n\n\u002F\u002F create the saga middleware\nconst sagaMiddleware = createSagaMiddleware()\n\u002F\u002F mount it on the Store\nconst store = createStore(reducer, applyMiddleware(sagaMiddleware))\n\n\u002F\u002F then run the saga\nsagaMiddleware.run(mySaga)\n\n\u002F\u002F render the application\n```\n\n# Documentation\n\n- [Introduction](https:\u002F\u002Fredux-saga.js.org\u002Fdocs\u002Fintroduction\u002FBeginnerTutorial.html)\n- [Basic Concepts](https:\u002F\u002Fredux-saga.js.org\u002Fdocs\u002Fbasics\u002FDeclarativeEffects)\n- [Advanced Concepts](https:\u002F\u002Fredux-saga.js.org\u002Fdocs\u002Fadvanced\u002FChannels)\n- [Recipes](https:\u002F\u002Fredux-saga.js.org\u002Fdocs\u002Frecipes\u002Findex.html)\n- [External Resources](https:\u002F\u002Fredux-saga.js.org\u002Fdocs\u002FExternalResources.html)\n- [Troubleshooting](https:\u002F\u002Fredux-saga.js.org\u002Fdocs\u002FTroubleshooting.html)\n- [Glossary](https:\u002F\u002Fredux-saga.js.org\u002Fdocs\u002FGlossary.html)\n- [API Reference](https:\u002F\u002Fredux-saga.js.org\u002Fdocs\u002Fapi\u002Findex.html)\n\n# Translation\n\n- [Chinese](https:\u002F\u002Fgithub.com\u002FsuperRaytin\u002Fredux-saga-in-chinese)\n- [Traditional Chinese](https:\u002F\u002Fgithub.com\u002Fneighborhood999\u002Fredux-saga)\n- [Japanese](https:\u002F\u002Fgithub.com\u002Fredux-saga\u002Fredux-saga\u002Fblob\u002Fmain\u002FREADME_ja.md)\n- [Korean](https:\u002F\u002Fgithub.com\u002Fmskims\u002Fredux-saga-in-korean)\n- [Portuguese](https:\u002F\u002Fgithub.com\u002Fjoelbarbosa\u002Fredux-saga-pt_BR)\n- [Russian](https:\u002F\u002Fgithub.com\u002Fredux-saga\u002Fredux-saga\u002Fblob\u002Fmain\u002FREADME_ru.md)\n\n# Using umd build in the browser\n\nThere is also a **umd** build of `redux-saga` available in the `dist\u002F` folder. When using the umd build `redux-saga` is available as `ReduxSaga` in the window object. This enables you to create Saga middleware without using ES6 `import` syntax like this:\n\n```javascript\nvar sagaMiddleware = ReduxSaga.default()\n```\n\nThe umd version is useful if you don't use Webpack or Browserify. You can access it directly from [unpkg](https:\u002F\u002Funpkg.com\u002F).\n\nThe following builds are available:\n\n- [https:\u002F\u002Funpkg.com\u002Fredux-saga\u002Fdist\u002Fredux-saga.umd.js](https:\u002F\u002Funpkg.com\u002Fredux-saga\u002Fdist\u002Fredux-saga.umd.js)\n- [https:\u002F\u002Funpkg.com\u002Fredux-saga\u002Fdist\u002Fredux-saga.umd.min.js](https:\u002F\u002Funpkg.com\u002Fredux-saga\u002Fdist\u002Fredux-saga.umd.min.js)\n\n**Important!** If the browser you are targeting doesn't support _ES2015 generators_, you must transpile them (i.e. with [babel plugin](https:\u002F\u002Fgithub.com\u002Ffacebook\u002Fregenerator\u002Ftree\u002Fmain\u002Fpackages\u002Fregenerator-transform)) and provide a valid runtime, such as [the one here](https:\u002F\u002Funpkg.com\u002Fregenerator-runtime\u002Fruntime.js). The runtime must be imported before **redux-saga**:\n\n```javascript\nimport 'regenerator-runtime\u002Fruntime'\n\u002F\u002F then\nimport sagaMiddleware from 'redux-saga'\n```\n\n# Building examples from sources\n\n```sh\n$ git clone https:\u002F\u002Fgithub.com\u002Fredux-saga\u002Fredux-saga.git\n$ cd redux-saga\n$ yarn\n$ npm test\n```\n\nBelow are the examples ported (so far) from the Redux repos.\n\n### Counter examples\n\nThere are three counter examples.\n\n#### counter-vanilla\n\nDemo using vanilla JavaScript and UMD builds. All source is inlined in `index.html`.\n\nTo launch the example, open `index.html` in your browser.\n\n> Important: your browser must support Generators. Latest versions of Chrome\u002FFirefox\u002FEdge are suitable.\n\n#### counter\n\nDemo using `webpack` and high-level API `takeEvery`.\n\n```sh\n$ npm run counter\n\n# test sample for the generator\n$ npm run test-counter\n```\n\n#### cancellable-counter\n\nDemo using low-level API to demonstrate task cancellation.\n\n```sh\n$ npm run cancellable-counter\n```\n\n### Shopping Cart example\n\n```sh\n$ npm run shop\n\n# test sample for the generator\n$ npm run test-shop\n```\n\n### async example\n\n```sh\n$ npm run async\n\n# test sample for the generators\n$ npm run test-async\n```\n\n### real-world example (with webpack hot reloading)\n\n```sh\n$ npm run real-world\n\n# sorry, no tests yet\n```\n\n### TypeScript\n\nRedux-Saga with TypeScript requires `DOM.Iterable` or `ES2015.Iterable`. If your `target` is `ES6`, you are likely already set, however, for `ES5`, you will need to add it yourself.\nCheck your `tsconfig.json` file, and the official \u003Ca href=\"https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002Fhandbook\u002Fcompiler-options.html\">compiler options\u003C\u002Fa> documentation.\n\n### Logo\n\nYou can find the official Redux-Saga logo with different flavors in the [logo directory](https:\u002F\u002Fgithub.com\u002Fredux-saga\u002Fredux-saga\u002Ftree\u002Fmain\u002Flogo).\n\n## Redux Saga chooses generators over `async\u002Fawait`\n\nA [few](https:\u002F\u002Fgithub.com\u002Fredux-saga\u002Fredux-saga\u002Fissues\u002F1373#issuecomment-381320534) [issues](https:\u002F\u002Fgithub.com\u002Fredux-saga\u002Fredux-saga\u002Fissues\u002F987#issuecomment-301039792) have been raised asking whether Redux saga plans to use `async\u002Fawait` syntax instead of generators.\n\nWe will continue to use [generators](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FGenerator). The primary mechanism of `async\u002Fawait` is Promises and it is very difficult to retain the scheduling simplicity and semantics of existing Saga concepts using Promises. `async\u002Fawait` simply don't allow for certain things - like i.e. cancellation. With generators we have full power over how & when effects are executed.\n\n## Backers\n\nSupport us with a monthly donation and help us continue our activities. \\[[Become a backer](https:\u002F\u002Fopencollective.com\u002Fredux-saga#backer)\\]\n\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F0\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F0\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F1\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F1\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F2\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F2\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F3\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F3\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F4\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F4\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F5\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F5\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F6\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F6\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F7\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F7\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F8\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F8\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F9\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F9\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F10\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F10\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F11\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F11\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F12\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F12\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F13\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F13\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F14\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F14\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F15\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F15\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F16\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F16\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F17\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F17\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F18\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F18\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F19\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F19\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F20\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F20\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F21\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F21\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F22\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F22\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F23\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F23\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F24\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F24\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F25\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F25\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F26\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F26\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F27\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F27\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F28\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F28\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F29\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fbacker\u002F29\u002Favatar.svg\">\u003C\u002Fa>\n\n### Sponsors\n\nBecome a sponsor and get your logo on our README on Github with a link to your site. \\[[Become a sponsor](https:\u002F\u002Fopencollective.com\u002Fredux-saga#sponsor)\\]\n\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F0\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F0\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F1\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F1\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F2\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F2\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F3\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F3\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F4\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F4\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F5\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F5\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F6\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F6\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F7\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F7\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F8\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F8\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F9\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F9\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F10\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F10\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F11\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F11\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F12\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F12\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F13\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F13\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F14\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F14\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F15\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F15\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F16\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F16\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F17\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F17\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F18\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F18\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F19\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F19\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F20\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F20\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F21\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F21\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F22\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F22\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F23\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F23\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F24\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F24\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F25\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F25\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F26\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F26\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F27\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F27\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F28\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F28\u002Favatar.svg\">\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F29\u002Fwebsite\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fopencollective.com\u002Fredux-saga\u002Fsponsor\u002F29\u002Favatar.svg\">\u003C\u002Fa>\n\n## License\n\nCopyright (c) 2015 Yassine Elouafi.\n\nLicensed under The MIT License (MIT).\n","redux-saga 是一个用于 Redux 应用的副作用处理库，旨在简化异步操作如数据获取等的管理。它通过使用 ES6 的生成器（Generators）来实现易于编写、阅读和测试的异步流程，这些流程看起来就像标准的同步 JavaScript 代码。作为 Redux 中间件，redux-saga 允许开发者以动作的形式启动、暂停或取消副作用线程，并且能够访问整个应用的状态。与 redux-thunk 相比，redux-saga 可以避免回调地狱问题，使得异步逻辑更加清晰可控。适用于需要处理复杂异步操作的前端项目中，特别是在需要保持良好可维护性和测试性的场景下。","2026-06-11 02:52:24","top_language"]