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);
}