等待呼叫完成,然后在传奇中调度动作

时间:2019-03-26 06:34:29

标签: reactjs redux redux-saga

我想打电话给服务器,然后使用该数据来调度其他操作。

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

但是它不在行
旁边运行代码         常量数据=产生调用(请求,{网址,方法:“ POST”,数据:reqsData})
我有类似的代码,在此之前它可以正常运行+我检查了网络,并得到了此行的响应200。
我已经使用 fork 代替了通话,但是在通话完成之前,它会在该行旁边运行我的代码。

2 个答案:

答案 0 :(得分:0)

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

收益电话(methodToCallApi(),params,to,method)。同样,最好将服务调用保存在单独的文件中,然后仅在saga中调用这些方法,而不是直接在saga中定义。

答案 1 :(得分:0)

似乎您的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 })