gpt4 book ai didi

javascript - Puppeteer promise 一个事件,这是正确的事件控制流程吗?

转载 作者:行者123 更新时间:2023-12-02 22:01:54 25 4
gpt4 key购买 nike

我试图在使用 puppeteer 时获取下载文件的名称,并且进行了以下设置,但我想知道如何最好地为 page.on( 'response', ...,因为我希望每次下载文件时都能够设置和取消设置此事件:

async (page) => {
const form = await page.$('#selector');
const [filename] = await Promise.all([
getFileNamePromise(page),
form.evaluate(form => form.submit())
])
return filename;
};

function getFileNamePromise(page) {
return new Promise (resolve => {
page.on('response', response => {
const disposition = response.headers()['content-disposition'];

if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) {
resolve(matches[1].replace(/['"]/g, '')) ;
}
}
})
});
}

我也很好奇这是否容易受到在加载事件监听器之前下载文件的竞争条件的影响?

最佳答案

here在文档中。

第一个代码示例之后是:

The Page class emits various events (described below) which can be handled using any of Node's native EventEmitter methods, such as on, once or removeListener.

稍后它会这样说,然后是一个代码示例:

To unsubscribe from events use the removeListener method:

function logRequest(interceptedRequest) {
console.log('A request was made:', interceptedRequest.url());
}
page.on('request', logRequest);
// Sometime later...
page.removeListener('request', logRequest);

所以我假设您可以效仿类似 page.removeListener('response'....

至于你问题中的竞争条件部分,我没有足够的 Puppeteer 经验来给你一个权威的答案。对我来说,似乎您总是能够比响应发生的速度更快地设置事件监听器,因为当响应添加到事件队列时,设置事件监听器的代码已经位于事件循环中。不过,我不确定。

关于javascript - Puppeteer promise 一个事件,这是正确的事件控制流程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59851238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com