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))
——正如我所说的承诺。所有的都与此无关。避免!避开这个!