如何在Postman测试中使用Promises?

Fel*_*ets 2 javascript testing asynchronous promise postman

我需要在Postman测试中使用一些异步代码.

由于这是一个复杂的场景,我使用以下代码在一个非常简单的测试中重现了这个场景:

let promiseNumber = 0;

function resolvedPromise() {
    return new Promise((resolve, reject) => {
        pm.sendRequest('https://postman-echo.com/get', (err, res) => {
            if (err) {
                console.log(err);
                reject();
            } else {
                console.log(`Resolved promise ${++promiseNumber}`);
                resolve();
            }
        });
    });
}

resolvedPromise()
    .then(resolvedPromise)
    .then(resolvedPromise)
    .catch(err => console.log(err));
Run Code Online (Sandbox Code Playgroud)

控制台上的预期结果是:

Resolved promise 1
Resolved promise 2
Resolved promise 3
Run Code Online (Sandbox Code Playgroud)

但我得到了:

Resolved promise 1
Run Code Online (Sandbox Code Playgroud)

有没有办法在Postman上提供Promise或异步代码?

Fel*_*ets 7

我做了一些测试,并意识到在使用pm.sendRequest后它总是停止工作.如果我尝试解决Promise它的工作原理.

似乎是一个看着这个线程的已知错误.

它的解决方法只是在处理代码时保持打开超时.只需确保所有可能的路径都清除超时或呼叫将挂起25天

// This timeout ensure that postman will not close the connection before completing async tasks.
//  - it must be cleared once all tasks are completed or it will hang
const interval = setTimeout(() => {}, Number.MAX_SAFE_INTEGER);

let promiseNumber = 0;

function resolvedPromise() {
    return new Promise((resolve, reject) => {
        pm.sendRequest('https://postman-echo.com/get', (err, res) => {
            if (err) {
                console.log(err);
                reject();
            } else {
                console.log(`Resolved promise ${++promiseNumber}`);
                resolve();
            }
        });
    });
}

resolvedPromise()
    .then(resolvedPromise)
    .then(resolvedPromise)
    .then(() => clearTimeout(interval))
    .catch(err => {
        console.log(err);
        clearTimeout(interval);
    });
Run Code Online (Sandbox Code Playgroud)

现在它打印出预期的结果:

Resolved promise 1
Resolved promise 2
Resolved promise 3
Run Code Online (Sandbox Code Playgroud)

  • 我尝试将它与 Number.MAX_SAFE_INTEGER 一起使用,但没有成功。如果你用超过 1000 的东西替换它,它就可以工作。 (3认同)
  • 每个请求似乎需要 200 到 500 毫秒之间的时间。所以是的,我可以确认之前的评论建议_任何超过 1000 的内容_。链接的请求越多,“clearTimeout”所需的值就越高。我也玩了一下上限,发现10亿有效,但不是100亿(ms)。 (2认同)
  • @seemcat 同意,这非常重要!不要使用“Number.MAX_SAFE_INTEGER”!使用类似“100000”的内容。 (2认同)