在这里我发出了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中。无论如何,我让控制台记录一个promise,并且没有任何类型的对象按照预期存储在状态中。根据文档,如果返回一个promise,seem调用应该会暂停生成器,但这似乎并没有发生。
编辑:这就是为什么你需要远离屏幕的原因。我所需要做的就是从搜索函数中删除"*“。超级简单。
发布于 2020-07-20 19:53:31
看起来很简单。您所需要做的就是将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);
}
https://stackoverflow.com/questions/63002822
复制相似问题