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