循环ajax请求,直到Promise.all中返回响应

时间:2019-02-28 14:51:00

标签: javascript promise

    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中做到这一点,这可能吗?谢谢

2 个答案:

答案 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});
    });
}

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