зацикливать ajax-запрос, пока он не вернется с ответом в Promise.all - PullRequest
0 голосов
/ 28 февраля 2019
    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 минут.Через некоторое время список готовится на сервере, а затем сервер возвращает массив.Мне нужно зацикливать вызов getList('PDF') каждые 10 секунд, пока ответ не будет пустым.

Я хотел бы сделать это в Promise.all, возможно ли это?Спасибо

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я не знаю, насколько вы контролируете архитектуру вашей системы, но это хороший сценарий для реализации веб-сокетов, я настоятельно рекомендую этот подход по сравнению с опросом на стороне клиента.

Однако, если выищите быстрое решение, этот простой код должен помочь вам:

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

Кстати, я упустил обработку ошибок для простоты кода

0 голосов
/ 28 февраля 2019

Нет, вы не должны делать это в пределах 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 обещание от вашего методаесли вы отклоните его, сбросив ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...