【问题标题】:Pass additional parameters to Javascript request 3 argument callback将附加参数传递给 Javascript 请求 3 参数回调
【发布时间】:2016-09-19 18:21:12
【问题描述】:

我试图嵌套几个回调,目的是使用 POST 请求以编程方式导航页面。我有一个我正在尝试下载的不同文件的列表,并且想为每个文件分配一个不同的文件名,以便我可以进行异步下载调用并对它们执行 OCR。

实际下载PDF的回调在这里:

filename = "doodle" + Math.floor((Math.random() * 100) + 1) + ".pdf";    
request.post(
                {
                    url:'https://ecorp.sos.ga.gov/BusinessSearch/DownloadFile',
                    form: {
                        'documentId': body
                    },
                    headers: {
                        'Referer': 'https://ecorp.sos.ga.gov/BusinessSearch/BusinessFilings'
                    }
                }, getPDF).pipe(fs.createWriteStream(filename));

请注意,请求会将结果页面发送到 getPdf 函数,该函数实际上会在发出请求后为 OCR 打开 PDF。目前我在 OCR 方法中有一个硬编码的文件名,因为我不知道如何将附加变量传递给回调函数。我希望能够写入一个随机生成的文件,并在回调方法中检索该文件名。

function getPDF (error, response, body) {
    if(!error){
        console.log(body);


        filename = "/doodle" + Math.floor((Math.random() * 100) + 1) + ".pdf";
        //console.log(__dirname + filename);

        /*pdfText(__dirname + "/doodle.pdf", function(err, chunks) {
            //console.log(chunks);
        });*/



        var pdf_path = __dirname + filename;

        //option to extract text from page 0 to 10 
        var option = {from: 0, to: 10};
        var pdf_body;

        pdfUtil.pdfToText(pdf_path, option, function(err, data) {
            pdf_body = data;  
            var result;

            try{
                var namez = /AUTHORIZED SIGNATURE:\s+(.+?)\s{2}/.exec(data)[1];
                var emailz = /Email: (.+?)\s{2}/.exec(data)[1];
                result = {query:query, info:{name: namez, email: emailz}};

            } catch (err){
                //result = {query:query, error:"non-selectable text in PDF"};
            }

            results.push(result);

            //console.log(JSON.stringify(result));
        });


    }
}

我使用的库叫做request

文档显示如下:

回调参数有 3 个参数:

An error when applicable (usually from http.ClientRequest object)
An http.IncomingMessage object
The third is the response body (String or Buffer, or JSON object if the json option is supplied)

【问题讨论】:

    标签: javascript callback request


    【解决方案1】:

    最直接的方法是简单地将 getPDF 的签名更改为

    function getPDF (filename, error, response, body) {...}
    

    然后你会在一个匿名函数中调用它作为 request.post 的回调处理程序:

    request.post({...}, function(error, response, body){
        getPDF( 'filename', error, response, body);
    });
    

    E6 表示法让这变得更好:

    request.post({...}, (error, response, body)=>{
        getPDF( 'filename', ...arguments);
    });
    

    您可以使用更复杂的方法来完成此操作,方法是部分应用附加参数,然后以无点方式调用它:

    function getPDF (filename, error, response, body, ) {...}
    getPdf2 = getPDF.bind(null, "filename"); 
    request.post({...}, getPdf2);
    

    这些方法等同于同一件事,我可能会根据情况使用其中任何一种。可以说,第二种方法的意图更容易阅读。它当然更时尚。

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 2011-06-29
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 2011-10-05
      相关资源
      最近更新 更多