Javascript 木偶演员预言一个事件,这是正确的事件控制流吗?
我试图在使用Puppeter时获取下载文件的名称,我有以下设置,但我想知道如何最好地为Javascript 木偶演员预言一个事件,这是正确的事件控制流吗?,javascript,promise,dom-events,puppeteer,Javascript,Promise,Dom Events,Puppeteer,我试图在使用Puppeter时获取下载文件的名称,我有以下设置,但我想知道如何最好地为页面重新设置侦听器。在('response'),…,因为我希望每次下载文件时都能设置和取消设置此事件: async (page) => { const form = await page.$('#selector'); const [filename] = await Promise.all([ getFileNamePromise(page), form.evaluate(for
页面重新设置侦听器。在('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, '')) ;
}
}
})
});
}
我还很好奇,如果在加载事件侦听器之前下载文件,那么这是否会受到竞争条件的影响?请参阅文档
第一个代码示例如下所示:
Page类发出各种事件(如下所述),这些事件可以
使用节点的任何本机EventEmitter方法进行处理,例如on,
一次或二次
稍后它会这样说,然后是一个代码示例:
要取消订阅事件,请使用removeListener方法:
因此,我假设您可以使用类似于page.removeListener('response')…
的方法
至于你问题中的竞赛条件部分,我没有足够的木偶师经验给你一个权威的答案。对我来说,似乎你总是能够设置事件监听器的速度比响应速度快,因为设置事件监听器的代码在添加响应时已经在事件循环中了d到事件队列。但是,我不确定。进入文档
第一个代码示例如下所示:
Page类发出各种事件(如下所述),这些事件可以
使用节点的任何本机EventEmitter方法进行处理,例如on,
一次或二次
稍后它会这样说,然后是一个代码示例:
要取消订阅事件,请使用removeListener方法:
因此,我假设您可以使用类似于page.removeListener('response')…
的方法
至于你问题中的竞赛条件部分,我没有足够的木偶师经验给你一个权威的答案。对我来说,似乎你总是能够设置事件监听器的速度比响应速度快,因为设置事件监听器的代码在添加响应时已经在事件循环中了d添加到事件队列。但是,我不确定。谢谢,我最终添加了removeListener,作为与解决承诺相关的逻辑的一部分。如下所示:
page.on('response', function getFileNameFromRequest(response) {
//check for "Content-Disposition" ?
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, ''));
page.removeListener("response", getFileNameFromRequest);
}
}
});
谢谢,我最终添加了removeListener,作为与解决承诺相关的逻辑的一部分。如下所示:
page.on('response', function getFileNameFromRequest(response) {
//check for "Content-Disposition" ?
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, ''));
page.removeListener("response", getFileNameFromRequest);
}
}
});
您是指删除页面的侦听器。on('response'…
?@LonnieBest是-我更新了问题。您是指删除页面的侦听器。on('response'…
?@LonnieBest是-我更新了问题。