Redux-saga 没有等待 api 调用来解决,而是不断返回承诺。如何让 "yeild call" 等待 api 呼叫?
Redux-saga isn't waiting for api calls to resolve, keeps returning promises. How do I make "yeild call" wait for on api calls?
我在哪里发出 API 请求:
function* search(value){
// return new Promise(async (resolve, reject)=>{
// try {
// const res = await axios.get(`https://www.breakingbadapi.com/api/characters?name=${value}`)
// console.log(res.data)
// resolve(res.data)
// } catch (error) {
// reject(error)
// }
// })
return axios.get(`https://www.breakingbadapi.com/api/characters?name=${value}`)
.then(res=>{
console.log(res.data)
})
.catch(err=>{
// console.log(err)
})
}
我在哪里调用此函数来获取结果并将其置于状态:
function* startSearch(value){
try {
yield put({type:'loading'})
const person = yield call(search, value)
console.log("SAGA",person)
yield put({type:'success', payload:person})
} catch (error) {
yield put({type:'failure'})
}
}
如您所见,我已尝试将 api 调用包装在 promise 和典型的 .then .catch 中。无论我保持什么控制台记录承诺,并且没有任何类型的对象按预期存储在状态中。根据文档 yield 调用应该暂停生成器,如果它 returns 一个承诺,但这似乎没有发生。
编辑:这就是为什么你需要远离屏幕的人。我所需要做的就是从搜索功能中删除“*”。超级简单。
看似简单。您需要做的就是将 promise 生成函数调用包装在它自己的函数中,然后您可以使用 Redux-Saga 的 call()
.
调用它
我认为您只需要将 search
函数设为常规函数而不是生成器函数即可。 (去掉*
)
function search(url) {
return axios({ url })
.then(response => response.data)
.catch(err => {
log.error(err);
});
}
function* startSearch() {
const response = yield call(search, downloadURL);
}
我在哪里发出 API 请求:
function* search(value){
// return new Promise(async (resolve, reject)=>{
// try {
// const res = await axios.get(`https://www.breakingbadapi.com/api/characters?name=${value}`)
// console.log(res.data)
// resolve(res.data)
// } catch (error) {
// reject(error)
// }
// })
return axios.get(`https://www.breakingbadapi.com/api/characters?name=${value}`)
.then(res=>{
console.log(res.data)
})
.catch(err=>{
// console.log(err)
})
}
我在哪里调用此函数来获取结果并将其置于状态:
function* startSearch(value){
try {
yield put({type:'loading'})
const person = yield call(search, value)
console.log("SAGA",person)
yield put({type:'success', payload:person})
} catch (error) {
yield put({type:'failure'})
}
}
如您所见,我已尝试将 api 调用包装在 promise 和典型的 .then .catch 中。无论我保持什么控制台记录承诺,并且没有任何类型的对象按预期存储在状态中。根据文档 yield 调用应该暂停生成器,如果它 returns 一个承诺,但这似乎没有发生。
编辑:这就是为什么你需要远离屏幕的人。我所需要做的就是从搜索功能中删除“*”。超级简单。
看似简单。您需要做的就是将 promise 生成函数调用包装在它自己的函数中,然后您可以使用 Redux-Saga 的 call()
.
我认为您只需要将 search
函数设为常规函数而不是生成器函数即可。 (去掉*
)
function search(url) {
return axios({ url })
.then(response => response.data)
.catch(err => {
log.error(err);
});
}
function* startSearch() {
const response = yield call(search, downloadURL);
}