Обещание.все с axios / node.js

#node.js #promise #axios

#node.js #обещание #axios

Вопрос:

Я немного застрял здесь, пытаясь дождаться результатов от двух или более обещаний axios, чтобы обработать их дальше. console.log(«test»); выполняется до того, как другие вызовы метода будут полностью выполнены. Я чувствую, что настройка рекурсивного синтаксического анализа неверна, но не уверен, что настроить. У кого-нибудь здесь есть идея? Большое вам спасибо.

Вывод —

 test
Mon Sep 14 2020 14:04:37 GMT 0100 (Irish Standard Time) - 2020-09-13T00:00:00Z - 2020-09-14T00:00:00Z - 0 - 14897 - 1000
Mon Sep 14 2020 14:04:37 GMT 0100 (Irish Standard Time) - 6 - 3247395
  

Указатель —

 Promise.all([
  vault.collectAuditTrailHistory('document_audit_trail', startDate, endDate),
  vault.collectGroupMembers(6)
]).then(result => {
  console.log("test");
})
  

класс хранилища —

 async login() {
        return this.axiosInstance
            .post('/api/v20.2/auth', 'username='   this.username   'amp;password='   this.password, this.config)
            .then(response => {
                if (response.data.responseStatus = "SUCCESS") {
                    this.axiosInstance.defaults.headers.common['Authorization'] = response.data.sessionId;
                }
            })
            .catch(error => console.error(error));
    }

    async collectAuditTrailHistory(audittrail, startDate, endDate) {
        // check valid login
        if (this.isLoggedIn()) {
            return this.axiosInstance
                .get('/api/v20.2/audittrail/'  audittrail  '?start_date='   startDate   'amp;end_date='   endDate   'amp;limit=1', this.config)
                .then(response => {
                    this.parseAuditTrailHistoryPage(audittrail, startDate, endDate, 0, response.data.responseDetails.total, 1000);
                })
                .catch(error => console.error(error));
        } else {
            return this.login()
                .then((response) => {
                    this.collectAuditTrailHistory(audittrail, startDate, endDate);
                });
        }
    }

    async collectGroupMembers(groudId) {
        // check valid login
        if (this.isLoggedIn()) {
            return this.axiosInstance
                .get('/api/v20.2/objects/groups/'   groudId, this.config)
                .then(response => {
                    for(let i = 0; i < response.data.groups[0].group.members__v.length; i  ){ 
                        this.collectUserName(groudId, response.data.groups[0].group.members__v[i]);
                    }
                })
                .catch(error => console.error(error));
        } else {
            return this.login()
                .then((response) => {
                    return this.collectGroupMembers(groudId);
                });
        }
    }

    async collectUserName(groudId, userId) {
        // check valid login
        if (this.isLoggedIn()) {
            return this.axiosInstance
                .get('/api/v20.2/objects/users/'   userId, this.config)
                .then(response => {
                    console.log(new Date()   " - "   groudId   " - "   userId);
                    this.groupMembers.push([groudId,response.data.users[0].user.user_name__v]);
                })
                .catch(error => console.error(error));
        } else {
            return this.login()
                .then((response) => {
                    return this.collectUserName(groudId, userId);
                });
        }
    }

    isLoggedIn() {
        if (!this.axiosInstance.defaults.headers.common['Authorization'] || !this.lastTxnDateTime)
            return false;
        else {
            let diff = Math.abs(new Date() - this.lastTxnDateTime);
            if (Math.floor((diff/1000)/60) < 15) {
                return true;
            }
            else {
                return false;
            }
        }
    }

    async parseAuditTrailHistoryPage(audittrail, startDate, endDate, offset, total, limit) {
        console.log(new Date()   " - "   startDate   " - "   endDate   " - "   offset   " - "   total   " - "   limit);
        return this.axiosInstance
            .get('/api/v20.2/audittrail/'   audittrail   '?start_date='   startDate   'amp;end_date='   endDate   'amp;limit='   limit   'amp;offset='   offset, this.config)
            .then(response => {
                if ((offset limit) < total) {
                    this.auditTrailHistory = this.auditTrailHistory.concat(response.data.data);
                    this.parseAuditTrailHistoryPage(audittrail, startDate, endDate, (offset limit 1), total, limit);                    
                }
                else {
                    this.auditTrailHistory = this.auditTrailHistory.concat(response.data.data);
                }
            })
            .catch(error => console.error(error));
    }
  

Ответ №1:

Я думаю, что вам чего-то не хватает return в вас then .

     async parseAuditTrailHistoryPage(audittrail, startDate, endDate, offset, total, limit) {
        console.log(new Date()   " - "   startDate   " - "   endDate   " - "   offset   " - "   total   " - "   limit);
        return this.axiosInstance
            .get('/api/v20.2/audittrail/'   audittrail   '?start_date='   startDate   'amp;end_date='   endDate   'amp;limit='   limit   'amp;offset='   offset, this.config)
            .then(response => {
                if ((offset limit) < total) {
                    this.auditTrailHistory = this.auditTrailHistory.concat(response.data.data);

                    // return promise (add it to the end of the  promise chaine)
                    return this.parseAuditTrailHistoryPage(audittrail, startDate, endDate, (offset limit 1), total, limit);                    
                }
                else {
                    this.auditTrailHistory = this.auditTrailHistory.concat(response.data.data);
                }
            })
            .catch(error => console.error(error));
    }
  

Без исправления parseAuditTrailHistoryPage не будет ждать разрешения внутренней parseAuditTrailHistoryPage проблемы. С исправлением каждая итерация рекурсии будет ждать следующей до последней (когда (offset limit) < total == false) .

Та же проблема в collectUserName , collectAuditTrailHistory ,

Комментарии:

1. Привет @Daniel, большое спасибо за ваш быстрый ответ. Вы правы, я смог исправить это на основе ваших комментариев для collectAuditTrailHistory , но почему-то я изо всех сил пытаюсь добавить это в collectGroupMembers . Если я добавлю возврат в цикл, подобный return this.collectUserName(groudId, response.data.groups[0].group.members__v[i]); , это нарушит цикл, и будет захвачен только один пользователь. Может быть, у вас есть какие-нибудь идеи, как это настроить?

2. Я понял это — let promises = []; for (let i = 0; i < response.data.groups[0].group.members__v.length; i ) { promises.push(this.collectUserName(groudId, response.data.groups[0].group.members__v[i])); } return Promise.all(promises);

3. Или return Promise.all(response.data.groups[0].group.members__v.map(member => this.collectUserName(groudId, member)));