Javascript 关于for循环中邮递员中sendRequest的问题

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 = {

我目前正在努力解决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);
}
我不明白为什么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