Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 木偶演员预言一个事件,这是正确的事件控制流吗?_Javascript_Promise_Dom Events_Puppeteer - Fatal编程技术网

Javascript 木偶演员预言一个事件,这是正确的事件控制流吗?

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

我试图在使用Puppeter时获取下载文件的名称,我有以下设置,但我想知道如何最好地为
页面重新设置
侦听器。在('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是-我更新了问题。