如何在extractIssueData中使用文件路径



我使用的是request NPM包和request take两个参数请求(URL,回调(;

在这里,我想以某种方式将额外的参数传递给我的回调函数,我该怎么做。这是我试图写的代码

function extractIssues(url,filepath){

request(url,issueCb);
}
function issueCb(err,response,html)
{
if(err){
console.log(err+"at line 61");
}
else{
extractIssueData(html);
}

}
function extractIssueData(html){
let selTool = cheerio.load(html);
let arr = [];
let issueLinksArr = selTool(".flex-auto.min-width-0.p-2.pr-3.pr-md-2 > a");

let result="";
for(let i = 0;i<issueLinksArr.length;i++){
let issueLink = selTool(issueLinksArr[i]).attr("href");
let content = selTool(issueLinksArr[i]).text().trim().split("/n")[0];

let obj = {
link :issueLink,
content:content
}

let str = JSON.stringify(obj);
result = result + str + " ,"+ "n" ; 
}

console.log(result);

}

我想在extractIssueData中使用文件路径,所以我需要首先在issueCb中捕获它。我该怎么做我找不到合适的答案。

如果您简化为使用单个函数,此问题将完全消失!如果不是对代码的改进,以下内容应该相当于:

let extractIssues = async (url, filepath) => {

// Wait for the html content of a `request` call
let html = await new Promise((resolve, reject) => {
// If an Error occurs reject with the error, otherwise resolve with
// html data
request(url, (err, res, html) => err ? reject(err) : resolve(html));
});

let selTool = cheerio.load(html);

// Collect href and text content values from <a> elements
let resultsArr = selTool(".flex-auto.min-width-0.p-2.pr-3.pr-md-2 > a")
.map(issueLink => ({
link: selTool(issueLink).attr("href"),
content: selTool(issueLink).text().trim().split("/n")[0]
}));

// Print the array of link+content data
console.log(resultsArr);

};

请注意,在此函数中,您可以访问filepath,因此可以根据需要使用它。

没有async的解决方案看起来像:

let extractIssues = (url, filepath) => {

request(url, (err, res, html) => {

if (err) throw err;

let selTool = cheerio.load(html);

// Collect href and text content values from <a> elements
let resultsArr = selTool(".flex-auto.min-width-0.p-2.pr-3.pr-md-2 > a")
.map(issueLink => ({
link: selTool(issueLink).attr("href"),
content: selTool(issueLink).text().trim().split("/n")[0]
}));

// Print the array of link+content data
console.log(resultsArr);

});

};

这再次创建了一个场景,其中filepath可在函数中根据需要使用。

注意:如果你是";给定指令";不使用async会对你造成伤害;async是javascript的核心特性和主要卖点。一旦你适应了async,你很快就会后悔没有它的工作。我建议你花点时间去理解它!:(

我可以为您创建一个使用回调函数的简单示例。我知道这是一个愚蠢的例子,但它可以帮助你理解回调是如何工作的。

function myFunc(callback) {
let errMessage = "This is error callback";
let message = "This is normal message";
callback(errMessage, message);
}
function myCallbackFunc(err, result) {
if(!err) {
console.log(result);
return;
}
console.log(err);
}
myFunc(myCallbackFunc);

你不会这样使用它,但如果你想发送错误回调,你应该为null以响应参数。像这样:

function myFunc(callback) {
let errMessage = "This is error callback";
let message = "This is normal message";
let somethingBadHappened = true;

if(somethingBadHappened) {
return callback(errMessage, null);
}
callback(null, message)
}
function myCallbackFunc(err, result) {
if(!err) {
console.log(result);
return;
}
console.log(err);
}
myFunc(myCallbackFunc);

最新更新