邮递员API-setNextRequest不设置下一个请求

时间:2019-11-21 14:36:56

标签: javascript api if-statement variables postman

我有一个获取工作状态的API。 它解析响应正文并寻找作业的“状态:”。

如果是正在进行的操作,我告诉请求等待10秒钟并重新运行,但这没有发生,它只是移至下一个。

这是我正在运行的测试:

pm.environment.unset("JobStatus");
var jsonData = pm.response.json();
pm.environment.set("JobStatus", jsonData['progress-update'].state);

const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds));
};

pm.environment.get("JobStatus");

if (    environment.JobStatus == "DONE") 
{
  postman.setNextRequest("Export Results");
}
else if (    environment.JobStatus == "INPROGRESS")
{
  sleep(10000).then(() => {
  postman.setNextRequest("Get Job Status");
})}
else {
  postman.setNextRequest(null);
}

数据具有我要检查的主任务,然后有许多具有相同状态INPROGRESS字符串的子任务。

{
    "progress-update": {
        "@type": "parallel-progress",
        "job": {
            "@href": "/api/space/job-management/jobs/4755716"
        },
        "taskId": 4755716,
        "jobName": "Compare Config-4755716",
        "state": "INPROGRESS",
        "status": "UNDETERMINED",
        "percentage": 10,
        "subTask": [
            {
                "@type": "percentage-complete",
                "state": "INPROGRESS",
                "status": "UNDETERMINED",
                "percentage": 0
            },

该变量已正确设置,但未遵循我的else if语句。

enter image description here

编辑:

我更改了逻辑,以在请求4的测试中设置变量,并在脚本前请求5进行检查。 这应该将收集运行器发送回请求4,直到JobStatus ==“ DONE”为止,但是不是这样。

我添加了一些其他代码来帮助我从控制台查看其性能:

    const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds));
};

pm.environment.get("JobStatus");

if (    environment.JobStatus === "DONE") 
{
  postman.setNextRequest("Export Results");
  console.log("DONE")
  console.log(environment.JobStatus)
}
else if (    environment.JobStatus === "INPROGRESS")
{
  sleep(10000).then(() => {
  postman.setNextRequest("Get Job Status");
  console.log("INPROGRESS")
  console.log(environment.JobStatus)
})}
else {
  postman.setNextRequest(null);
  console.log("ELSE")
  console.log(environment.JobStatus)
}

执行此操作后,我得到

INPROGRESS

INPROGRESS

在控制台中打印。并且它只是完成了请求,而没有将自己发送回请求4进行重试。

为什么要遵循逻辑,否则会忽略setNextRequest?

2 个答案:

答案 0 :(得分:0)

您要尝试执行的操作最好使用收集运行器和setNextRequest完成。我已经花了数小时试图以相同的方式完成您正在尝试的相同事情,但是却一无所获。这是您最好的选择:

https://learning.getpostman.com/docs/postman/scripts/branching-and-looping/

不幸的是,这仅适用于收集运行器,但其想法是,在单个请求中,您将执行所有if语句,并基于setNextRequest("same_request")setNextRequest(null)的逻辑< / p>

答案 1 :(得分:0)

对于那些可能遇到此问题的人,我发现了这个问题,或者说是两个问题。

我的environment.JobStatus变量没有设置,我不知道如何做到这一点。所以我报废了环境变量,只是在JS中声明了它。

其次,我的postman.setNextRequest(“ Get Job Status”)被忽略了,因为它嵌套在sleep函数中。不知道为什么会导致它,但是我把它从睡眠中删除了,现在循环很好。

var jsonData = pm.response.json();
var jobState = jsonData['progress-update'].state

const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds));
};


if (    jobState === "DONE") 
{
  console.log(jobState);
}
else if (    jobState === "INPROGRESS")
{
  sleep(10000).then(() => {
  console.log(jobState);
})
    postman.setNextRequest("Get Job Status");
}
else {
  console.log("ELSE Clause was matched.");
  console.log(jobState);
  postman.setNextRequest(null);
}