processUpdate() {
const {number} = this.props;
Promise.all([
getList('PDF'),
getName()
]).then(([list, name]) => {
this.setState({list, name});
}).catch((error) => {
ErrorService.setPageError('Eeerr');
throw error;
});
}
getList('PDF')
api调用返回一个空数组,持续2-3分钟。在服务器上准备好一些时间列表之后,服务器将返回一个数组。我需要每10秒循环一次getList('PDF')
调用,直到响应不为空为止。
我想在Promise.all中做到这一点,这可能吗?谢谢
答案 0 :(得分:1)
否,您不应该在Promise.all
内这样做,这与它无关。您只需要一种递归方法即可轮询,直到结果不再为空为止。
function getListResult(id) {
return getList(id).then(result => result.length ? result : getListResult(id));
}
processUpdate() {
return Promise.all([
getListResult('PDF'),
// ^^^^^^
getName()
]).then(([list, name]) => {
this.setState({list, name});
}, error => {
ErrorService.setPageError('Eeerr');
throw error;
});
}
顺便说一句,如果您通过重新抛出错误拒绝了诺言,请不要忘记return
来自您方法的诺言。
答案 1 :(得分:1)
我不知道您对系统的体系结构有多少控制权,但这是实现Web套接字的一个好方案,我强烈建议您采用这种方法来进行客户端轮询。
但是,如果您正在寻找一种快速修复方法,那么此简单代码将为您提供帮助:
processUpdate(id) {
let pdfsPromise = new Promise(resolve => {
var getPdfs = () => {
return new Promise(resolve => {
let pdfs = getList('PDF');
if(pdfs && pdfs.length > 0) {
resolve(pdfs);
}
else {
setTimeout(() => {
getPdfs().then(pdfs => {
resolve(pdfs);
});
}, 10000)
}
})
}
getPdfs.then( pdfs => {
resolve(pdfs);
});
});
Promise.all([pdfsPromise, getName()]).then (([list, name]) => {
this.setState({list, name});
});
}
顺便说一句,为了简化代码,我省略了错误处理