【发布时间】:2019-11-23 19:17:40
【问题描述】:
我有一个用 Node 编写的服务,并将获取特定城市团队列表的请求发送到另一个 API 服务。
请求参数:
city-
page per_page
响应正文:
pageper_pagemoreteams
per_page 默认设置为 1000,但团队数量远大于 1000,并且响应中未返回某些团队。我需要所有的团队。
由于某些原因我不打算在这里指定,我不想更改per_page参数,但我想做的是发送第一个请求并检查响应正文中的more是否为true(意思是还有更多的团队),我从响应正文中提取团队并将其添加到最终结果中,增加page 参数并使用参数发送请求:
{
"page": "2",
"city": "chicago",
"per_page": 1000,
}
我一直这样做,直到 more 标头为 false。
该服务是用 Node 编写的,我使用 request 包来发送 HTTP 请求。最初,我想使用while loop:
function teamsInCity(city, page, result, callback) {
let more = true;
while(more) {
// send the request
// extract teams into the result array
// check if there is more
// send another request
// keep sending requests and appending teams until more is false
}
// return the final result with all the teams
}
但这不起作用,因为while loop 发送请求并继续执行下一行代码而不等待响应。所以我用递归解决了它并且它有效。但我需要对尾调用进行优化,我不确定,但我认为 Node 不支持,但我可能错了。
有没有办法在while loop 内部发送请求而不使用async/await 和承诺?
下面是我的递归工作函数:
function teamsInCity(city, page, result, callback) {
request.get({
url: 'my_service' + '/teams',
qs: { 'city' : city, 'page': page, 'per_page': 1000 },
json: true
}, function(err, response, body) {
if (err) { return callback(err); }
result = result.concat(body.teams);
if (body.more) {
page++;
return teamsInCity(city, page, result, callback);
}
return callback(null, result);
});
}
这里是调用teamsInCity()的路由
router.get('/:city', function(req, res) {
var data = {teams: []};
myService.teamsInCity(req.params.city, 1, [], function(err, teams) {
if (err) {
logger.error('Error while retrieving teams in ' + req.params.city);
}
data.teams = _.sortBy(teams, 'name');
res.send(data);
});
});
谢谢!
【问题讨论】:
-
" 不使用 async/await 和 promises?" ????有什么理由不?
-
"但我需要对它进行尾调用优化" 你的函数已经对尾调用进行了优化
-
@AvcS 您能否详细说明您的评论?根据this post V8 没有实现 TCO。
标签: javascript node.js api recursion request