你能帮我提示:d吗?这是我的代码:
const request = require('request');
const cheerio = require('cheerio');
function getUrls(url) {
const baseUrl = 'https://unsplash.com';
let urls = [];
request(url, (err, res, body) => {
if (!err && res.statusCode === 200) {
const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true });
$('.photo.qa-photo a').each((i, e) => {
const lnk = $(e).attr('href');
if (lnk.indexOf('@') === -1 && lnk.indexOf('download') === -1) {
urls.push(baseUrl + lnk);
}
});
}
});
return urls;
}
function getImages(arr) {
let images = [];
for (const url of arr) {
request(url, (err, res, body) => {
if (!err && res.statusCode === 200) {
const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true });
$('script').each((i, e) => {
if (i === 4) {
let img = $(e).text();
img = img.substring(img.indexOf('full') + 7, img.indexOf('regular') - 3);
images.push(img);
}
});
} else {
console.log(err, res.statusCode);
}
});
}
return images;
}
console.log(getImages(getUrls('https://unsplash.com/search?utf8=%E2%9C%93&keyword=life&button=')));
单独函数运行良好,但是如果我想组合两个函数控制台。对不起我的英语不好。有了这个小程序,我想从unsplash.com获取20张图像的完整URL提前。
bacause请求函数异步调用,因此parent函数(geturls,getimages)在填充数组之前返回。您必须使用回调。
javaScript是一种异步语言。这里发生的事情是您的getImages
功能不等待您的getUrls
函数完成。
您需要在getImages
功能中使用回调或承诺,以便等待getUrls
。
以下是回调的一些教程
回调是JavaScript中非常重要的概念,我强烈建议您了解其工作原理。这将使您的生活更轻松。承诺也是如此。
这是您的代码的示例
const request = require('request');
const cheerio = require('cheerio');
// callback is the function to be called when this one finishes
function getUrls(url, callback) {
const baseUrl = 'https://unsplash.com';
let urls = [];
request(url, (err, res, body) => {
if (!err && res.statusCode === 200) {
const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true });
$('.photo.qa-photo a').each((i, e) => {
const lnk = $(e).attr('href');
if (lnk.indexOf('@') === -1 && lnk.indexOf('download') === -1) {
urls.push(baseUrl + lnk);
}
});
}
});
//Notice the call to callback.
callback(urls);
}
function getImages(arr) {
let images = [];
for (const url of arr) {
request(url, (err, res, body) => {
if (!err && res.statusCode === 200) {
const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true });
$('script').each((i, e) => {
if (i === 4) {
let img = $(e).text();
img = img.substring(img.indexOf('full') + 7, img.indexOf('regular') - 3);
images.push(img);
}
});
} else {
console.log(err, res.statusCode);
}
});
}
return images;
}
console.log(getUrls('https://unsplash.com/search?utf8=%E2%9C%93&keyword=life&button=', function(urls){getImages(urls)}));
我尚未测试它,但是它应该起作用或足够近。