Javascript 循环ajax请求,直到它在Promise.all内返回响应

Javascript 循环ajax请求,直到它在Promise.all内返回响应,javascript,promise,Javascript,Promise,getList('PDF')api调用返回空数组2-3分钟。一段时间后,列表在服务器上准备就绪,然后服务器返回一个数组。我需要每隔10秒循环getList('PDF')调用一次,直到响应不是空的 我想答应你。好吧,那可能吗?谢谢不,你不应该在承诺的范围内做这件事。所有的,都与此无关。您只需要一种递归方法来轮询,直到结果不再为空: processUpdate() { const {number} = this.props; Promise.all([

getList('PDF')
api调用返回空数组2-3分钟。一段时间后,列表在服务器上准备就绪,然后服务器返回一个数组。我需要每隔10秒循环
getList('PDF')
调用一次,直到响应不是空的


我想答应你。好吧,那可能吗?谢谢

不,你不应该在承诺的范围内做这件事。所有的,都与此无关。您只需要一种递归方法来轮询,直到结果不再为空:

    processUpdate() {
        const {number} = this.props;

        Promise.all([
            getList('PDF'),
            getName()
        ]).then(([list, name]) => {

            this.setState({list, name});
        }).catch((error) => {

            ErrorService.setPageError('Eeerr');
            throw error;
        });
    }


顺便说一句,如果您通过重新引用错误来拒绝承诺,请不要忘记
返回方法中的承诺。

不,您不应该在
承诺的范围内这样做。所有这些都与此无关。您只需要一种递归方法来轮询,直到结果不再为空:

    processUpdate() {
        const {number} = this.props;

        Promise.all([
            getList('PDF'),
            getName()
        ]).then(([list, name]) => {

            this.setState({list, name});
        }).catch((error) => {

            ErrorService.setPageError('Eeerr');
            throw error;
        });
    }


顺便说一句,如果您通过重新引用错误来拒绝方法,请不要忘记
返回
方法的承诺。

我不知道您对系统的体系结构有多大的控制权,但这是实现web套接字的一个好方案,我强烈建议通过客户端轮询实现这种方法

但是,如果您正在寻找快速修复方法,此简单代码应该可以帮助您:

processUpdate() {
    return Promise.all([
        getListResult('PDF'),
//             ^^^^^^
        getName()
    ]).then(([list, name]) => {
        this.setState({list, name});
    }, error => {
        ErrorService.setPageError('Eeerr');
        throw error;
    });
}

顺便说一句,为了代码的简单性,我省略了错误处理

我不知道您对系统的体系结构有多大的控制,但这是实现web套接字的一个好方案,我强烈建议通过客户端轮询来实现这种方法

但是,如果您正在寻找快速修复方法,此简单代码应该可以帮助您:

processUpdate() {
    return Promise.all([
        getListResult('PDF'),
//             ^^^^^^
        getName()
    ]).then(([list, name]) => {
        this.setState({list, name});
    }, error => {
        ErrorService.setPageError('Eeerr');
        throw error;
    });
}

顺便说一句,为了代码的简单性,我省略了错误处理

调用
getList('PDF')
本身,设置超时时间可能为10秒?您还需要始终返回新的调用,因此
Promise.all
在您最终获得所需状态时仍会解析。然后它将传递到
this.setState({list,name})使用空数组。这正是我试图阻止的。我错了吗?没错,这就是为什么你不用一个空列表来解析,而是用一个新的
getList('PDF')
调用返回的新承诺来解析
Promise(Promise(Promise))。然后,只有在最内部的Promise解析时才会调用
代码行让我认为代码属于React组件。是这样吗?那么@Bergi的答案就是你需要做的。在内部调用
getList('PDF')
,可能需要10秒的
setTimeout
?您还需要始终返回新的调用,因此
Promise.all
在您最终获得所需状态时仍会解析。然后它将传递到
this.setState({list,name})使用空数组。这正是我试图阻止的。我错了吗?没错,这就是为什么你不用一个空列表来解析,而是用一个新的
getList('PDF')
调用返回的新承诺来解析
Promise(Promise(Promise))。然后,只有在最内部的Promise解析时才会调用
代码行让我认为代码属于React组件。是这样吗?那么@Bergi的答案就是你需要做的。谢谢Bergi,你应该把计时器放在哪里,每10秒钟做一次?在结果函数或承诺中。全部?我没法理解。你是说你不想马上重试?然后你要做一个
延迟(10e3)。然后(()=>getListResult(id))
在结果函数中-正如我所说的
承诺。所有的
都与此无关。谢谢Bergi,应该把计时器放在哪里每10秒做一次?在结果函数或承诺中。全部?我没法理解。你是说你不想马上重试?然后在result函数中执行一个
延迟(10e3)。然后(()=>getListResult(id))
——正如我所说的
承诺。所有的
都与此无关。避免!避开这个!