javascript - Redux-saga 不等待 api 调用解决,而是不断返回承诺。如何让“yield call”等待 api 调用?
问题描述
我在哪里发出 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 调用应该暂停生成器,但这似乎没有发生。
编辑:这就是为什么你需要远离屏幕的人。我需要做的就是从搜索功能中删除“*”。超级容易。
解决方案
看似简单。您需要做的就是将 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);
}
推荐阅读
- javascript - 如何将悬停颜色添加到具有线性渐变边框的 div?
- android-emulator - 带有 vnc 服务器的无头仿真器
- javascript - 我需要提取字符串中数字的前 6 位和后 4 位,并使用正则表达式删除相同的前导零
- json - powershell json打印父母和孩子
- django - 更新现有模型的 FieldField
- django - Django inineformset 保存和删除
- asp.net-core - 如何在 AddFacebook AspNetCore 身份验证方案上正确设置 auth_type 参数?
- android - 无法访问动态功能模块的资源
- java - 如何从 XML 文件生成带有 jacksonxml 注释的 java 类
- android - 将数据从广播接收器发送到活动