【问题标题】:Waiting for call to finish and then dispatch action in saga等待调用完成,然后在 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 我得到了响应
  • 你能添加一个你如何在外面使用传奇的例子吗?

标签: reactjs redux redux-saga


【解决方案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 中定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2019-05-13
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多