关于for循环中Postman中sendRequest的问题
Problem regarding sendRequest in Postman in a for loop
我目前正在努力解决有关 Postman 预请求脚本中 pm.sendRequest 的问题。
我正在尝试 运行 for 循环中的请求,但它无法正常工作。
预请求脚本
var numberOfCampaigns = 2; //this number can have any value from 1 to 20)
for (var j = 0; j < numberOfCampaigns; j++) {
console.log(`J1:` + j);
var request_call = {
url: pm.environment.get("api-url"),
method: "POST",
header: {
"content-type": "text/xml",
SOAPAction: "add",
},
body: {
mode: "raw",
raw: "some-body"},
};
pm.sendRequest(request_call, (err, res) => {
if (err) {
} else {
console.log(`J2:` + j);
length = 2
for (var i = 0; i < length; i++) {
pm.environment.set(`someVariable_` + i + `_` + j, responseJson[i]);
console.log(`someVariable:`+i+`_`+j+`:`+ pm.environment.get(`someVariable_` + i + `_`+j));
}
}
});
console.log(`J3:` + j);
}
控制台输出:
J1:0
J3:0
J1:1
J3:1
POST https://api-url/
J2:2
someVariable_0_2:...
someVariable_1_2:...
POST https://api-url/
J2:2
someVariable_0_2:...
someVariable_1_2:...
GET https://api-url2/ (The actual Request)
我不明白为什么 J2 控制台输出是 2 而不是第一个请求是 1 然后第二个请求是 2
你能帮忙吗?
更新
在@Keith 回应后我试着做了一些改变:
var numberOfCampaigns = 2
const _dummy = setInterval(() => {}, 300000 );
function sendRequest(req) {
return new Promise((resolve, reject) => {
pm.sendRequest(req, (err,res) => {
if (err) {
console.log(err);
return reject(err);
}
console.log(`J2:` + j);
for (let i = 0; i < length; i++) {
pm.environment.set(`someVariable_` + i + `_` + j, responseJson[i]);
console.log(`someVariable:`+i+`_`+j+`:` + pm.environment.get(`someVariable_` + i + `_`+j));
}
return resolve(res);
})
});
}
(async function main() {
for(var j=0; j<numberOfCampaigns; j++){
var request_call = {
url: pm.environment.get("api-url"),
method: "POST",
header: {
"content-type": "text/xml",
SOAPAction: "add",
},
body: {
mode: "raw",
raw: pm.environment.get(`parameter`+j},
};
await sendRequest(request_call);
clearInterval(_dummy);
}
})();
您的脚本是异步的 - pm.sendRequest
发出请求并在该请求完成时调用您的回调函数。
这可能需要不同的时间。
我希望你的脚本开始:
J1:0
J3:0
J1:1
J3:1
因为所有这些都是同步的。
J2:
将在您的 HTTP 请求 return 时出现,但到那时您的循环将完成,因此它们都将显示 J2:2
.
请注意,i
会起作用,因为它在您的回调函数中,而 var j
是 global - JS 不会将闭包应用于循环或块除非你使用 let j
并且回调会保留对它的引用。
您甚至可能 someVariable
日志乱序,因为请求不会排队 - 无论服务器在第一个请求之前完成第二个请求。
避免这种情况的最佳方法是使用 await
或 Promise.all
以确保在异步操作完成之前,回调之外的 JS 不会 运行。
我目前正在努力解决有关 Postman 预请求脚本中 pm.sendRequest 的问题。 我正在尝试 运行 for 循环中的请求,但它无法正常工作。
预请求脚本
var numberOfCampaigns = 2; //this number can have any value from 1 to 20)
for (var j = 0; j < numberOfCampaigns; j++) {
console.log(`J1:` + j);
var request_call = {
url: pm.environment.get("api-url"),
method: "POST",
header: {
"content-type": "text/xml",
SOAPAction: "add",
},
body: {
mode: "raw",
raw: "some-body"},
};
pm.sendRequest(request_call, (err, res) => {
if (err) {
} else {
console.log(`J2:` + j);
length = 2
for (var i = 0; i < length; i++) {
pm.environment.set(`someVariable_` + i + `_` + j, responseJson[i]);
console.log(`someVariable:`+i+`_`+j+`:`+ pm.environment.get(`someVariable_` + i + `_`+j));
}
}
});
console.log(`J3:` + j);
}
控制台输出:
J1:0
J3:0
J1:1
J3:1
POST https://api-url/
J2:2
someVariable_0_2:...
someVariable_1_2:...
POST https://api-url/
J2:2
someVariable_0_2:...
someVariable_1_2:...
GET https://api-url2/ (The actual Request)
我不明白为什么 J2 控制台输出是 2 而不是第一个请求是 1 然后第二个请求是 2
你能帮忙吗?
更新
在@Keith 回应后我试着做了一些改变:
var numberOfCampaigns = 2
const _dummy = setInterval(() => {}, 300000 );
function sendRequest(req) {
return new Promise((resolve, reject) => {
pm.sendRequest(req, (err,res) => {
if (err) {
console.log(err);
return reject(err);
}
console.log(`J2:` + j);
for (let i = 0; i < length; i++) {
pm.environment.set(`someVariable_` + i + `_` + j, responseJson[i]);
console.log(`someVariable:`+i+`_`+j+`:` + pm.environment.get(`someVariable_` + i + `_`+j));
}
return resolve(res);
})
});
}
(async function main() {
for(var j=0; j<numberOfCampaigns; j++){
var request_call = {
url: pm.environment.get("api-url"),
method: "POST",
header: {
"content-type": "text/xml",
SOAPAction: "add",
},
body: {
mode: "raw",
raw: pm.environment.get(`parameter`+j},
};
await sendRequest(request_call);
clearInterval(_dummy);
}
})();
您的脚本是异步的 - pm.sendRequest
发出请求并在该请求完成时调用您的回调函数。
这可能需要不同的时间。
我希望你的脚本开始:
J1:0
J3:0
J1:1
J3:1
因为所有这些都是同步的。
J2:
将在您的 HTTP 请求 return 时出现,但到那时您的循环将完成,因此它们都将显示 J2:2
.
请注意,i
会起作用,因为它在您的回调函数中,而 var j
是 global - JS 不会将闭包应用于循环或块除非你使用 let j
并且回调会保留对它的引用。
您甚至可能 someVariable
日志乱序,因为请求不会排队 - 无论服务器在第一个请求之前完成第二个请求。
避免这种情况的最佳方法是使用 await
或 Promise.all
以确保在异步操作完成之前,回调之外的 JS 不会 运行。