关于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 jglobal - JS 不会将闭包应用于循环或块除非你使用 let j 并且回调会保留对它的引用。

您甚至可能 someVariable 日志乱序,因为请求不会排队 - 无论服务器在第一个请求之前完成第二个请求。

避免这种情况的最佳方法是使用 awaitPromise.all 以确保在异步操作完成之前,回调之外的 JS 不会 运行。