将其他参数传递给Javascript请求3参数回调

时间:2016-05-23 01:15:56

标签: javascript callback request

我正在尝试嵌套多个回调,其目标是使用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)

1 个答案:

答案 0 :(得分:0)

最直接的方法是简单地将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);

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