JHipster-函数完成后执行代码

时间:2019-12-10 14:31:51

标签: javascript reactjs typescript asynchronous jhipster

我正在将JHipster与React前端一起使用,并且在以下方面遇到了很大的问题:

function confirmRent() {
    const { rentEntity } = props;
    const entity = {
      ...rentEntity,
      ...rentValues
    };
    props.createRent(entity);
    /* execute this after createRent has finished
    const rentScsV = (res.value.status >= 200 && res.value.status < 300);
    props.history.push({
      pathname: "/",
      state: { rentScs: rentScsV }
    });
    */
  }

功能createRent位于另一个文件中

export const createRent: ICrudPutAction<IRent> = entity => async dispatch => {
  const result = await dispatch({
    type: ACTION_TYPES.CREATE_RENT,
    payload: axios.post(apiUrl, cleanEntity(entity))
  });
  dispatch(getEntities());
  return result;
};

我想在createRent完成后执行注释的代码。

我尝试在createRent中返回一个Promise并添加.then():我得到一个属性'then'不存在。

我尝试添加回调:它不会被执行,因为createRent无法访问历史记录。

我尝试像这样在await中添加confirmRent

async function confirmRent() {
...
await props.createRent(entity);
/* execute the rest */
}

我遇到Unexpected 'await' of a non-Promise (non-"Thenable") value错误。

据我所知,我无法更改createRent签名,因为其他模块中的许多其他功能都依赖于它。有谁知道如何解决此问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

我不知道什么是JHipster,但是如果我看正确的话,createRent本身并不是一个异步函数,它只是返回一个异步函数,因此实际上props.createRent(entity);调用确实在执行之前后面的代码。

[如果我写的是const add = x => y => x + y而不是const add = (x, y) => x + y,那么我就不得不称它为add(5)(3)而不是add(5, 3)。]

要实际使用它,您需要存储它返回的值,可以在其上使用.then(),例如:

const cr = props.createRent(entity);
cr(dispatch).then(res => {
  const rentScsV = (res.value.status >= 200 && res.value.status < 300);
  props.history.push({
    pathname: "/",
    state: { rentScs: rentScsV }
  });
)

或者您可以跳过中间变量并立即调用返回的函数:

props.createRent(entity)(dispatch).then(res => {
  const rentScsV = (res.value.status >= 200 && res.value.status < 300);
  props.history.push({
    pathname: "/",
    state: { rentScs: rentScsV }
  });
)

答案 1 :(得分:0)

@ lsti115最后的评论给了我一个主意,所以我尝试了这个

new Promise(resolve => {
  resolve(props.createRent(entity));
}).then(res => {
  const rentScsV = ((res as any).value.status >= 200 && (res as any).value.status < 300);
  props.history.push({
    pathname: "/",
    state: { rentScs: rentScsV }
  });
});

成功了。

这是否被认为是不好的编码?

我还必须强制转换res as any,因为编译器给了我这个错误 Property 'value' does not exist on type '{}'