Javascript 雷杜传奇不是';不要等待api调用解决,而是不断返回承诺。我该怎么做;yeild call“是的”;等待api调用?
我发出API请求的位置:Javascript 雷杜传奇不是';不要等待api调用解决,而是不断返回承诺。我该怎么做;yeild call“是的”;等待api调用?,javascript,reactjs,redux,redux-saga,Javascript,Reactjs,Redux,Redux Saga,我发出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.da
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调用包装为一个承诺和一个典型的.then.catch。不管我如何保证,没有任何类型的对象按预期状态存储。根据docs的说法,如果生成器返回承诺,收益率调用应该暂停生成器,但这似乎没有发生
编辑:这就是为什么你需要远离屏幕的原因。我所需要做的就是从搜索函数中删除“*”。超级简单。看似简单。您所需要做的就是将promise生成函数调用包装在自己的函数中,然后可以使用Redux Saga的
call()
调用该函数
我认为您只需要将搜索
函数设置为常规函数,而不是生成器函数。(卸下*
)
函数搜索(url){
返回axios({url})
.then(response=>response.data)
.catch(错误=>{
日志错误(err);
});
}
函数*startSearch(){
const response=yield调用(搜索、下载URL);
}
更像是令人尴尬的简单!我不敢相信我忽略了这一点。回想起来,一切似乎都很简单@警官,如果你能在你有空的时候把答案记下来,那真的会让我的一天很愉快!