等待调用完成,然后在 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 调用