我正在发出一个返回分页数据的请求,所以我想递归调用一个函数,直到我拥有所有的数据页面,如下所示:
router.get("/", (req, res) => {
doRequest(1, [])
.then(result => {
res.status(200).send(result);
})
.catch(error => {
console.error(error);
res.status(500).send("Error from request");
});
});
function doRequest(page, list){
let options = {
uri : "www.example.com",
qs : { "page" : page }
};
request(options)
.then((results) => {
list.push(results);
if(page === 2){
return Promise.resolve(list);
} else {
return doRequest(++page, list);
}
})
.catch((error) => {
return Promise.reject(error);
});
}
我的路由会立即返回Cannot read property 'then' of undefined
,因此doRequest()
显然会立即返回undefined
,而不是在准备好后返回列表。我是承诺的新手所以我确定我错过了一些非常简单的东西。
答案 0 :(得分:0)
将doRequest
功能更改为
function doRequest(page, list){
let options = {
uri : "www.example.com",
qs : { "page" : page }
};
return request(options)
.then((results) => {
list.push(results);
if(page === 2){
return Promise.resolve(list);
} else {
return doRequest(++page, list);
}
})
.catch((error) => {
return Promise.reject(error);
});
}
因此它可以返回请求,它实际上不返回任何内容(undefined
)
答案 1 :(得分:0)
事实上,doRequest返回'undefined',因为该函数不会返回任何内容。
你在那里的return语句属于'then'和'catch'的谓词,但你在函数doRequest中没有。
你应该返回'request'的结果,这应该是一个promise,所以你的代码应该是这样的
function doRequest(page, list){
let options = {
uri : "www.example.com",
qs : { "page" : page }
};
return request(options)
.then((results) => {
list.push(results);
if(page === 2){
return Promise.resolve(list);
} else {
return doRequest(++page, list);
}
})
.catch((error) => {
return Promise.reject(error);
});
}
除此之外,我认为这不是递归处理这个问题的好方法,但这可能是另一个讨论。