#javascript #node.js #rest
#javascript #node.js #rest
Вопрос:
Я хочу получить массив ключей от JIRA. Текущая функция работает, но когда я вызываю переменную pendingIssues в конце программы, она пуста, поскольку запрос еще не обработан функцией get_all_issues.
Как я могу изменить функцию, чтобы она ожидала запросов от функции, прежде чем запрашивать отложенные запросы.
код :
var pendingIssues = [];
function get_all_issues() {
console.log("Getting all JIRA issues...");
var TotalIssues = 1000;
var count_issue;
var flag_no_more_issue = 0;
for (count_issue = 0; count_issue < TotalIssues; count_issue =50){
console.log(count_issue);
//envoi de la requête
jira.searchJira(searchString = 'project= PITM',
optional ={
startAt:count_issue,
maxResults:50,
fields:["key"],
}).then(function(issues) {
//Ensemble des tickets à traiter
console.log('--------------------------- ');
console.log(Date.now());
var pas;
for (pas = 0; pas < 50 amp;amp; flag_no_more_issue != 1 ; pas ){
if (issues.issues[0] != null){
pendingIssues.push(issues.issues.pop().key)
console.log(pendingIssues.length)
//console.log(pas);
}
else{
var flag_no_more_issue = 1;
console.log('no more issue !')
}
}
})
.catch(function(err) {
console.error(err);
});
}
}
get_all_issues()
console.log('-----------------------------')
console.log(pendingIssues)
Комментарии:
1. Вы программист на Python? Мы не так передаем параметры в js
Ответ №1:
Это происходит из-за выполняемого вами асинхронного кода. Вам нужно переместить свой console.log(pendingIssues)
в свой then
раздел (когда ваше обещание будет эффективно выполнено).
Или, что еще лучше, вы можете сделать из своей get_all_issues
функции обещание, например:
function get_all_issues() {
return new Promise(function(resolve, reject) {
// your JIRA request etc
...
.then(function(issues){
resolve(issues)
})
.catch(function(err){
reject(err)
})
})
}
А затем используйте свое обещание следующим образом:
get_all_issues.then(function(pendingIssues){
console.log(pendingIssues)
})
Вы можете найти информацию об этом Promise
здесь: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise
Ответ №2:
Соберите все запросы в массив, затем вы можете использовать Promise.all(requestArray).then(…) для выполнения некоторой логики после того, как все обещания будут выполнены.
Это может выглядеть следующим образом:
for (count_issue = 0; count_issue < TotalIssues; count_issue =50){
pendingIssues.push(
jira.searchJira(
'project= PITM',
{
startAt:count_issue,
maxResults:50,
fields:["key"],
}).then(function(issues) {
//Ensemble des tickets à traiter
console.log('--------------------------- ');
console.log(Date.now());
var pas;
for (pas = 0; pas < 50 amp;amp; flag_no_more_issue != 1 ; pas ){
if (issues.issues[0] != null){
pendingIssues.push(issues.issues.pop().key)
console.log(pendingIssues.length)
//console.log(pas);
}
else{
var flag_no_more_issue = 1;
console.log('no more issue !')
}
}
}).catch(function(err) {
console.error(err);
});
}
)
}
Promise.all(pendingIssues).then(res => console.log(res))