Javascript 异步调用,fetch不等待完成,然后立即转到
我正在尝试一个接一个地对两个函数的运行进行排序 下面的代码正确地计算页面,但不向其调用者返回任何内容Javascript 异步调用,fetch不等待完成,然后立即转到,javascript,asynchronous,fetch,Javascript,Asynchronous,Fetch,我正在尝试一个接一个地对两个函数的运行进行排序 下面的代码正确地计算页面,但不向其调用者返回任何内容 const rp = require('request-promise'); const cheerio = require('cheerio'); const fetch = require('node-fetch'); async function getNumberOfPages(url) { const pageUrl = url + "1"; rp(pageUrl)
const rp = require('request-promise');
const cheerio = require('cheerio');
const fetch = require('node-fetch');
async function getNumberOfPages(url) {
const pageUrl = url + "1";
rp(pageUrl)
.then(function(html) {
return fetch(pageUrl)
.then(response => response.text())
.then(html => {
const entriesPerPage = 20;
const $ = cheerio.load(html);
let totalEntries = $(".Aa").first().text()
let pagesNumber = Math.ceil(totalEntries / entriesPerPage);
return pagesNumber;
})
})
}
实际上,调用者立即在B)中输入,控制台日志是“Number pages:undefined”
我不明白为什么。看来我应该去拿些东西,但不知道怎么做
另外,想知道是否有必要将rp
和fetch
一起使用,似乎只有一个就足够了
谢谢
getNumberOfPages
结束时没有返回任何内容,因此它返回一个解析为未定义的承诺
您需要显式地返回一些内容
async function getNumberOfPages(url) {
const pageUrl = url + "1";
return rp(pageUrl)
// etc
但是,现在,您在任何时候都不使用wait
返回承诺。因此,使用async
关键字是毫无意义的
function getNumberOfPages(url) {
const pageUrl = url + "1";
return rp(pageUrl)
// etc
或者,您可以重写函数以使用wait
async function getNumberOfPages(url) {
const pageUrl = url + "1";
const value_never_used = await rp(pageUrl);
const response = await fetch(pageUrl);
const html = await response.text();
const entriesPerPage = 20;
const $ = cheerio.load(html);
let totalEntries = $(".Aa").first().text();
let pagesNumber = Math.ceil(totalEntries / entriesPerPage);
return pagesNumber;
}
使用请求承诺
和节点获取
没有任何意义,因此值\u从未使用过
非常感谢!我接受了你的第一次反馈,并用它修复了我的代码,但你的第二部分肯定更有用。也谢谢你花时间解释和重写,干杯!
async function getNumberOfPages(url) {
const pageUrl = url + "1";
const value_never_used = await rp(pageUrl);
const response = await fetch(pageUrl);
const html = await response.text();
const entriesPerPage = 20;
const $ = cheerio.load(html);
let totalEntries = $(".Aa").first().text();
let pagesNumber = Math.ceil(totalEntries / entriesPerPage);
return pagesNumber;
}