reactjs在特定时间后不断发出承诺

时间:2016-07-22 05:23:43

标签: javascript reactjs es6-promise

在我的反应组件中,我在ComponentDidMount()中调用了这样的操作:

componentDidMount() {
        const { actions } = this.props

        function save_project_continiously() {
            console.log("inside")
            actions.save_project().then(save_project_continiously)
        }

        save_project_continiously()
    }

我在这里不停地呼吁行动......我的行为就像:

export function save_project() {
    return (dispatch, getState) => {

        setTimeout(() => {
            return dispatch(manage_data()).then(response => {
                console.log("Hellooww world")
                return response
            })
        }, 3000)
    }
}

当我这样做时,它给我一个错误,说.then()不是ComponentDidMount()中的函数。

如果我这样做

export function save_project() {
        return (dispatch, getState) => {

            return dispatch(manage_data()).then(response => {
                console.log("Hellooww world")
                return response
            })
        }
    }

它被连续调用,但我想在特定时间后连续调用它。

我试过了:

export function save_project() {
        return (dispatch, getState) => {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    return dispatch(manage_data()).then(response => {
                        console.log("Hellooww world")
                        return response
                    })
                }, 3000)
            })
        }
    }

但它只被调用一次..不会给出任何错误,但它只调用一次..

我想要的是我想在完成动作后的特定时间后连续调用动作。

在这里,我想打电话给save_project,在完成之后我又想在3秒后打电话给它,然后继续......

我怎样才能实现?

有什么建议吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

在这段代码中,您将承诺包含在承诺中,但您实际想要做的是在成功的承诺解析时再次执行此代码。

export function save_project() {
    // So this code does return callback, so it does not return promise
    // in your first example.
    return (dispatch, getState) => {
        // Then this code returns promise, but it never gets resolved.
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                // Then you return promise from set timeout, but it
                // is doubtful as well
                return dispatch(manage_data()).then(response => {
                    console.log("Hellooww world")
                    return response
                })
            }, 3000)
        })
    }
}

你真正想做的是:

// Just return promise of dispatch instead of wrapping it in
// a callback.
export function save_project() {
    return dispatch(manage_data());
}

// Then use set timeout here
function save_project_continiously() {
    console.log("inside")
    actions.save_project().then(() => {
        setTimeout(save_project_continiously, 3000);
    });
}

或者,如果您真的想在save_project中进行回调,则需要使用正确的args正确调用它,就像您的示例中的undefined一样。

答案 1 :(得分:0)

尝试setInterval()

export function save_project() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      dispatch(manage_data()).then(response => {
        resolve(response);
      }, error => {
        reject(response);
      })
    }, 3000)
  });
}