我在一个更大的应用程序中构建一个小节点js数据报废功能。我对Javascript的承诺并不那么舒服,所以请原谅我的误解。不确定我的标题是否构成我的问题。
所以我有这个:
const getAxiosUrls = function() { axios.get("http://localhost:3000/gatable")
.then(function (response) {
return urls = response.data.rows.map( ([x, y, z]) => y )
})}
和此:
const getNbShares = function() {
Promise.map(urls, requestPromise)
.map((htmlOnePage, index) => {
const $ = cheerio.load(htmlOnePage);
const share = $('.nb-shares').html();
let shareTuple = {};
shareTuple[urls[index]] = share;
return shareTuple;
})
.catch((e) => console.log('We encountered an error' + e));
}
我想这样做:
getAxiosUrls()
.then(getNbShares)
.then(res.json)
我尝试了一些东西,但大部分时间我都遇到以下错误:
Cannot read property 'then' of undefined
。另外为了确保我的getAxiosUrls
正常工作,我已经完成了这个
getAxiosUrls()
setTimeout(function() {console.log(urls)},5000)
并且日志按预期返回响应。那么我错过了什么?
答案 0 :(得分:3)
函数getAxiosUrls
和getNbShares
不会返回承诺。它应该是
const getAxiosUrls = function() {
return axios.get("http://localhost:3000/gatable")
.then(function (response) {
return urls = response.data.rows.map( ([x, y, z]) => y )
})
}
和
const getNbShares = function(urls) {
return Promise.map(urls, requestPromise)
.map((htmlOnePage, index) => {
const $ = cheerio.load(htmlOnePage);
const share = $('.nb-shares').html();
let shareTuple = {};
shareTuple[urls[index]] = share;
return shareTuple;
})
.catch((e) => console.log('We encountered an error' + e));
}
作为旁注:我建议删除.catch
函数中的getNbShares
,因为这会导致此函数中返回的承诺在出现错误时解析为undefined
(你没有在catch
处理程序中返回任何内容)。通常最好在您的保证链的最后添加错误处理,除非您可以采取措施从错误中恢复。