等待调用完成,然后在 saga 中调度操作

Posted

技术标签:

【中文标题】等待调用完成,然后在 saga 中调度操作【英文标题】:Waiting for call to finish and then dispatch action in saga 【发布时间】:2019-08-16 11:29:12 【问题描述】:

我想调用服务器,然后使用该数据发送其他操作。

export function* function1(actions) 
      console.log('inside');
      try 
        console.log('getting past orders list');
        const url = `/api/getOrders`;
        let reqsData = 
          order_id: actions.payload.order_id
        ;
        const data = yield call(request,  url, method: 'POST', data:reqsData )
        console.log(data);
        console.log('///////////////////////////////////');
        if (!data.error) 
          console.log(data)
          yield put( type: 'nowThis', payload: actions.payload.data );
         else 
          console.log('---------------------------------')
          console.log('got some error');
        
       catch (error) 
        console.log(error)
      
    

但它没有在行旁边运行代码 const data = yield call(request, url, method: 'POST', data:reqsData ) 我有类似的代码,之前它运行正常+我检查了网络,我得到了这条线的响应 200。 我已使用 fork 代替 call,但它会在调用完成之前在该行旁边运行我的代码。

【问题讨论】:

那条线是否中断了?它会去抓块吗?如果是,那么你能分享一下错误吗? @Fawaz 不是它没有抛出任何错误,并且在浏览器的网络部分我检查了请求的响应200 检查浏览器的控制台部分,你的catch块的控制台日志。 @Fawaz 它没有在 .catch 中打印任何内容,但在 .then 我得到了响应 你能添加一个你如何在外面使用传奇的例子吗? 【参考方案1】:

您的request 方法似乎没有正确返回。将其包裹在 Promise:

request() 
  return new Promise(resolve => 
    myApiCall().then(response => 
      resolve(response);
    ).catch(e => 
      reject(e);
    );
  );

然后在你的传奇中,你可以像往常一样yield

const data = yield call(request,  url, method: 'POST', data:reqsData )

【讨论】:

【参考方案2】:

yield 调用接受函数和参数。编写一个方法来进行服务调用。你可以使用 axios npm 包 (axios.get('../url',params:params)) 并在 yield 调用中调用该函数。

yield 调用(methodToCallApi(),params,to,method)。此外,最好将服务调用保存在单独的文件中,并在 saga 中调用这些方法,而不是直接在 saga 中定义。

【讨论】:

以上是关于等待调用完成,然后在 saga 中调度操作的主要内容,如果未能解决你的问题,请参考以下文章

Redux-Saga ES6类语法方法在调度操作时不会被调用

在 React Redux 中调度操作之前等待多个 Axios 调用

redux-saga 与 redux 一起使用会导致 render() 被调用两次

使用 saga 对组件进行 React 测试

如何在 redux-saga 中等待另一个动作

Redux thunk:如何等待异步操作的完成