gpt4 book ai didi

javascript - Redux saga 使用类的其他实例的参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:10:06 29 4
gpt4 key购买 nike

我有四个不同的 API 类实例,其中三个具有相同的参数,一个具有不同的参数。但是,具有不同参数的类似乎是用其他三个实例的参数实例化的。为什么会这样?

我有许多生成器函数(使用 redux-saga),我将 API 类的新实例作为参数传入,该实例具有 ID 和访问 token 。

这是三个类似生成器之一的示例:

const watchMagazineFetchRecentArticles = function* () {
yield takeEvery(C.FETCH_RECENT_ARTICLES, fetchMagazineRecentArticles,
new APIClass(SPACE_ID_ONE, ACCESS_TOKEN_ONE))
}

这是不同的:

const watchPressPageArticles = function* () {
yield takeEvery(C.FETCH_PRESS_PAGE_ARTICLES,
fetchPressPageArticlesSaga, (new APIClass(SPACE_ID_TWO,
ACCESS_TOKEN_TWO)))
}

这是 API 类:

import prefix from 'superagent-prefix'
const agent = require('superagent-use')(require('superagent'))

export default class APIClass {
constructor (spaceID, accessToken) {
this.fetchRecentArticles = this.fetchRecentArticles.bind(this)
this.fetchPressPageArticles = this.fetchPressPageArticles.bind(this)

agent.use(prefix(`https://cdn.contentful.com/spaces/${spaceID}`))
agent.use(((req) => {
req.header.Authorization = `Bearer ${accessToken}`
req.header.Accept = 'application/json'

return req
}))

this.instance = agent
}

fetchRecentArticles (numOfArticles) {
return this.instance
.get(`/entries?content_type=article&select-fields&order=-fields.publishDate&limit=${numOfArticles}`)
.then(response => response.body)
.catch(error => console.error(error))
}

fetchPressPageArticles () {
return this.instance
.get('/entries')
.then(response => response.body.items)
.catch(error => console.error(error))
}
}

当我调用 watchPressPageArticles 函数时,我可以看到正在使用 SPACE_ID_ONEACCESS_TOKEN_ONE 调用网络选项卡中的 api 请求参数而不是 SPACE_ID_TWOACCESS_TOKEN_TWO

另外值得注意的是,当我注释掉其他函数(使用 SPACE_ID_ONEACCESS_TOKEN_ONE)时,api 请求是使用正确的 spaceID 和 token 发出的。

我不确定为什么 saga 没有接受正确的论点或如何解释这种行为。任何想法将不胜感激!

最佳答案

问题似乎不在 Saga 中,但在任何新的 api 实例中都使用了相同的代理。如果你检查

const i1 = new APIClass('1', '1');
const i2 = new APIClass('2','2');

console.log(i1.instance === i2.instance); // true

可能的解决方法是在构造函数中实例化代理,而不是

const agent = require('superagent-use')(require('superagent'))

让我们将代理实例化移动到构造函数中:

const superagentUse = require('superagent-use');
const superagent = require('superagent');

module.exports = class APIClass {
constructor (spaceID, accessToken) {
const agent = superagentUse(superagent); // this agent will be used only in this instance
agent.use(prefix(...));

希望对您有所帮助。

关于javascript - Redux saga 使用类的其他实例的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388302/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com