最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Playwright throws aPIRequestContext.get: Request context disposed - Stack Overflow

programmeradmin1浏览0评论

I have a code that needs to loop the json file. However it throws this error:

aPIRequestContext.get: Request context disposed.

And I have no idea why. Here's how I implemented it:

When I try to put the block of code outside the base.loopJsonData, it works... but not when inside. I tried to print the json details and I'm getting an output but not when I'm using request.get()

Here's the loopJsonData:

public loopJsonData(json, data, callback) {
        const inputData = this.loadJSONData(json, data);
        inputData.forEach((val, i) => {
            ((item, index) => {
                callback(item, index, inputData);
            })(val, i);
        });
    }

Here's the loadJSONData:

public loadJSONData(path: string, testData: string) {
        let jsonPath;

        this.contentPath = join(process.cwd(), path);
        this.contentPath = normalizer.normalize(this.contentPath);
        this.contentPath = JSON.parse(fs.readFileSync(this.contentPath, "utf8"));
        jsonPath = this.contentPath;
        return jsonPath[testData];
    }

I have a code that needs to loop the json file. However it throws this error:

aPIRequestContext.get: Request context disposed.

And I have no idea why. Here's how I implemented it:

When I try to put the block of code outside the base.loopJsonData, it works... but not when inside. I tried to print the json details and I'm getting an output but not when I'm using request.get()

Here's the loopJsonData:

public loopJsonData(json, data, callback) {
        const inputData = this.loadJSONData(json, data);
        inputData.forEach((val, i) => {
            ((item, index) => {
                callback(item, index, inputData);
            })(val, i);
        });
    }

Here's the loadJSONData:

public loadJSONData(path: string, testData: string) {
        let jsonPath;

        this.contentPath = join(process.cwd(), path);
        this.contentPath = normalizer.normalize(this.contentPath);
        this.contentPath = JSON.parse(fs.readFileSync(this.contentPath, "utf8"));
        jsonPath = this.contentPath;
        return jsonPath[testData];
    }
Share Improve this question asked Dec 31, 2021 at 3:26 ohloriohlori 3102 gold badges10 silver badges23 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 2

loopJsonData takes async function but doesn't await it inside (just calls it synchronously for each data item inputData.forEach((val, i) => {). With such approach inner request.get() will run after the test method finishes and it will race with tear down logic which disposes the request (essentially you call request.get() after request.dispose() has been called).

To fix this you should ensure that all async callbacks are waited for, something like this:

async loopJsonData(json, data, callback) {
    const inputData = this.loadJSONData(json, data);
    const promises = [];
    inputData.forEach((val, i) => {
        promises.push(callback(val, i, inputData));
    });
    await Promise.all(promises);
}
发布评论

评论列表(0)

  1. 暂无评论