我有3个函数,每个函数都在另一个函数内部,我想从最后一个函数中响应。
是第一个函数(nodejspost函数(:
router.post('/urls', (req, response) => {
count = 2;
webUrl = req.body.url;
depth = req.body.depth;
if (bool) {
letstart(webUrl, count);
}
else {
console.log("Finish");
}
})
是第二个函数(请求库函数(:
function letstart(urlLink, counter) {
if (counter <= depth) {
request(urlLink, function (error, res, body) {
console.error('error:', error); // Print the error if one occurred
console.log('statusCode:', res && res.statusCode); // Print the response status code if a response was received
//console.log('body:', body); // Print the HTML for the Google homepage.
if (!error) {
getLinks(body);
}
else {
console.log("sorry");
}
});
}
else {
bool = false;
}
}
这是最后一个功能:
function getLinks(body) {
let allLists = [];
const html = body;
const $ = cheerio.load(html);
const linkObjects = $('a');
const links = [];
linkObjects.each((index, element) => {
var strHref = $(element).attr('href');
var strText = $(element).text();
var tel = strHref.startsWith("tel");
var mail = strHref.startsWith("mailto");
var linkInStart = strHref.startsWith("http");
if (strText !== '' && strText !== "" && strText !== null && strHref !== '' && strHref !== "" && strHref !== null && strHref !== undefined) {
if (!tel && !mail) {
if (linkInStart) {
links.push({
text: $(element).text(), // get the text
href: $(element).attr('href'), // get the href attribute
});
linkslinst.push($(element).attr('href'))
}
else {
links.push({
text: $(element).text(), // get the text
href: webUrl.toString() + $(element).attr('href'), // get the href attribute
});
linkslinst.push(webUrl.toString() + $(element).attr('href'))
}
}
}
});
const result = [];
const map = new Map();
count++;
for (const item of links) {
if (!map.has(item.href)) {
map.set(item.href, true); // set any value to Map
result.push({
text: item.text,
href: item.href
});
}
}
resArray.push({ list: result, depth: count - 1 });
}
我只想回应";resArray";到react-App.js,所以我认为我首先需要将这个数组返回到post函数。我该怎么做?
最简单的方法是将response
作为参数传递给letstart
,然后传递给getLinks
,这样您就可以在getLinks
结束时使用它,但这种解决方案非常脏,会使这两个函数难以重用。
更好的做法是让letstart
返回一个Promise
,并用body
解决它。然后使getLinks
返回resArray
。您将能够调用这两个函数,并在具有response
的post函数中直接获得它们的结果。
点击此处了解更多关于承诺