首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环ajax请求,直到它在Promise.all内返回响应

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

Stack Overflow用户
提问于 2019-02-28 22:51:00
回答 2查看 42关注 0票数 0
代码语言:javascript
复制
    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做,可以吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-28 23:14:51

不,你不应该在Promise.all中做这件事,那与它无关。您只需要一种递归方法来轮询,直到结果不再为空:

代码语言:javascript
复制
function getListResult(id) {
    return getList(id).then(result => result.length ? result : getListResult(id));
}

代码语言:javascript
复制
processUpdate() {
    return Promise.all([
        getListResult('PDF'),
//             ^^^^^^
        getName()
    ]).then(([list, name]) => {
        this.setState({list, name});
    }, error => {
        ErrorService.setPageError('Eeerr');
        throw error;
    });
}

顺便说一句,如果你通过重新抛出错误来拒绝它,不要忘了从你的方法中return promise。

票数 1
EN

Stack Overflow用户

发布于 2019-02-28 23:37:50

我不知道你对你的系统架构有多大的控制权,但这是一个很好的实现web套接字的场景,我强烈建议使用这种方法而不是客户端轮询。

但是,如果您正在寻找快速修复方法,下面这个简单的代码应该会对您有所帮助:

代码语言:javascript
复制
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});
    });
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54928354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档