Javascript 关于for循环中邮递员中sendRequest的问题
我目前正在努力解决Postman预请求脚本中关于pm.sendRequest的问题。 我试图在for循环中运行一个请求,但它不能正常工作 请求前脚本Javascript 关于for循环中邮递员中sendRequest的问题,javascript,postman,web-api-testing,postman-pre-request-script,Javascript,Postman,Web Api Testing,Postman Pre Request Script,我目前正在努力解决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 = {
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);
}
我不明白为什么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);
}
})();
var number=2
const_dummy=setInterval(()=>{},300000);
函数发送请求(req){
返回新承诺((解决、拒绝)=>{
pm.sendRequest(请求,(错误,恢复)=>{
如果(错误){
控制台日志(err);
退货拒绝(err);
}
console.log(`J2:`+j);
对于(设i=0;ipm.sendRequest
发出请求并在请求完成时调用回调函数
这可能需要不同的时间
我希望您的脚本开始:
J1:0
J3:0
J1:1
J3:1
因为所有这些都是同步的
J2:
将在HTTP请求返回时显示,但到那时,循环将完成,因此它们都将显示J2:2
请注意,i
将起作用,因为它位于回调函数内部,var j
是全局的-除非使用let j
,否则JS不会对循环或块应用闭包,回调将保留对它的引用
您甚至可能会使someVariable
日志无序,因为请求不会排队-任何服务器都可以在第一个请求之前完成第二个请求
避免这种情况的最好方法是使用
wait
或确保回调外部的JS在异步操作完成之前不会运行。如果(错误)添加登录。如果。完成,它可能会进入。谢谢你的建议@NehaPatil。我理解,但我如何使用wait或Promise实现所有这些请求,因为我不是JS方面的专家,这对我来说有点困难。我看到了()我可以实现,但我不明白在我的情况下如何实现,因为对我来说,每个请求的sendRequest数量可能不同。@Paracetamol12是的,该链接使用wait
,如果使用它,则意味着循环暂停(且不增加)直到请求完成。wait
听起来是让代码正常工作的最佳方式,但您需要在顶层方法上使用async
。我在原始帖子中添加了一个更新,其中包含了我的更改,但我不知道为什么它只适用于第一个请求,然后我收到referencerror:j未定义
然后发送请求是的,现在var j
在一个函数中,它对sendRequest
不再可见-在函数sendRequest(req,j)
中添加一个参数,然后执行等待sendRequest(request\u call,j)
请转达。非常感谢@Keith,我不知道如何感谢你,现在一切都很好,在你的建议之后,让clearInterval(\u dummy)退出for。再次感谢你
J1:0
J3:0
J1:1
J3:1