我正在尝试使用NodeJS / rally-node获取过去24小时的Rally修订历史记录。
Obj层次结构是:用户故事->修订历史记录->修订
我可以正确地得到结果,但是10个用户故事需要35秒。我在这里嵌入了示例代码。任何人都可以帮助我,如何提高性能!
谢谢! Sundarrajan R
示例代码:
'use strict'
let rally = require('rally');
let queryUtils = rally.util.query;
const restApi = rally({
apiKey: 'XXXXXXXXXXXX',
apiVersion: 'v2.0',
server: 'https://rally1.rallydev.com'
});
async function queryUserRevisions(revisions) {
const params = {
ref: revisions,
start: 1,
limit: 3,
order: 'RevisionNumber DESC',
fetch: ['RevisionNumber', 'Description', 'CreationDate', 'User']
};
return restApi.query(params);
}
async function queryUserRevisionHistory(RevisionHistory) {
const params = {
ref: RevisionHistory,
start: 1,
limit: 1,
fetch: ['Revisions']
}
return restApi.query(params);
}
async function traceRevisions() {
const startTime = new Date()
let UserStories;
let resultArray = [];
const ts = last24Hours();
const params = {
type: 'hierarchicalrequirement',
start: 1,
pageSize: 200,
limit: 100,
order: 'FormattedID',
fetch: ['Name', 'FormattedID', 'RevisionHistory'],
query: queryUtils.where('LastUpdateDate ', '>', '2020-04-13T00:00Z'),
scope: {
workspace: '/workspace/11111111111',
project: '/project/22222222222',
up: false,
down: true
}
};
try {
let response_one = await restApi.query(params);
const UserStoryCount = response_one.Results.length;
for (let i = 0; i < UserStoryCount; i++) {
UserStories = response_one.Results[i];
console.log(UserStories.FormattedID);
let response_two = await queryUserRevisionHistory(UserStories.RevisionHistory)
let response_three = await queryUserRevisions(response_two.Revisions);
for (let j = 0; j < response_three.Results.length; j++) {
let revision = response_three.Results[j];
resultArray.push({
FormattedID: UserStories.FormattedID,
RevisionNumber: revision.RevisionNumber,
Description: revision.Description,
CreationDate: revision.CreationDate,
UserName: revision.User._refObjectName
});
}
}
var endTime = new Date() - startTime;
console.log('Execution time: %dms', endTime);
return JSON.stringify(resultArray)
} catch (error) {
console.log(error);
}
}
module.exports.traceRevisions = traceRevisions;
答案 0 :(得分:0)
一种可能的优化方法是使用Promise.all
以并行方式而不是串行方式获取它们:
编辑:要比“获取它们”更具体,我的意思是先进行第一个查询-因为后面的查询依赖于此-然后再并行执行所有“ queryUserRevisionHistory,然后queryUserRevisions”链
async function traceRevisions() {
...
try {
let response_one = await restApi.query(params);
let resultArrays = await Promise.all( response_one.Results.map( async UserStories => {
console.log(UserStories.FormattedID);
let response_two = await queryUserRevisionHistory(UserStories.RevisionHistory)
let response_three = await queryUserRevisions(response_two.Revisions);
return response_three.Results.map( revision => ({
FormattedID: UserStories.FormattedID,
RevisionNumber: revision.RevisionNumber,
Description: revision.Description,
CreationDate: revision.CreationDate,
UserName: revision.User._refObjectName
}));
}));
let resultArray = [].concat( ...resultArrays );
var endTime = new Date() - startTime;
console.log('Execution time: %dms', endTime);
return JSON.stringify(resultArray)
} catch (error) {
console.log(error);
}
}