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')接口调用返回空数组2-3分钟。一段时间后,列表在服务器上准备就绪,然后服务器返回一个数组。我需要每10秒循环一次getList('PDF')调用,直到响应不为空。
我想用Promise.all做,可以吗?谢谢
发布于 2019-02-28 23:14:51
不,你不应该在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 promise。
发布于 2019-02-28 23:37:50
我不知道你对你的系统架构有多大的控制权,但这是一个很好的实现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(resolve);
}, 10000)
}
})
}
getPdfs().then(resolve);
});
Promise.all([pdfsPromise, getName()]).then (([list, name]) => {
this.setState({list, name});
});
}顺便说一句,为了代码简单,我省略了错误处理。
https://stackoverflow.com/questions/54928354
复制相似问题