我有点挣扎我的JavaScript。仍然围绕着回调。我有一个函数,它从REST端点递归地获取下一个链接页面。它适用于单个URL
现在我需要使用相同的recrusive函数为其他端点做同样的事情。那就是我现在挣扎的地方。很明显,我错过了一点,或者我非常理解回调概念。
请原谅我到目前为止所做的格式化..
function getFullLoad(rest_url,callback){
mongoose.connect(url, function(err) {
console.log(url);
if (err) throw err;
console.log("successfully connected");
getToken(function(err, token) {
if (err) throw console.error(err);
console.log('using access token to retrieve data :', token[0]
['access_token']);
var options = {
'auth': {
'bearer': token[0]['access_token']
}
}
request.get(rest_url, options, function(error, response, body) {
if (!error && response.statusCode === 200) {
var data = JSON.parse(body);
//save data in mongo
});
}
var next_page = JSON.parse(body)["_links"]["next"]
if (next_page) {
var next_page_url = JSON.parse(body)["_links"]["next"]["href"];
console.log("Fetching data from ", next_page);
//recrusively call back with next url
getFullLoad(next_page_url,callback);
} else {
callback();
} else {
if (error) throw error;
}
});
rest_url= "http://myrest_url"
//this bit is working if there is a single url
getFullLoad(rest_url, function() {
console.log('done , got all data');
});
这很好用,现在我需要用不同的url调用相同的函数。可能有些网址可能没有分页。
到目前为止,这是我的努力,它只需要第一个网址然后什么也不做。 这个位不起作用。我做错了什么?我尝试创建另一个回调函数。我想我的知识在回调上非常有限。任何帮助非常感谢
api_endpoints =[ {"url1": "http://url1"},{"url2": "http://url2"}]
api_endpoints.forEach(function(Item, endpoint) {
var endpoint_name = Object.keys(api_endpoints[endpoint]).toString());
var rest_url = api_config.BASE_URL + api_endpoints[endpoint]
[endpoint_name];
getFullLoad(rest_url, function) {
console.log('done');
});
});
感谢您查看我的问题
答案 0 :(得分:0)
通过一些重构,我认为你可以得到一些工作。
我会改变你的getFullLoad方法来返回一个promise(request.get)然后在你的foreach循环中我会构建一个promises数组,用不同的url调用getFullLoad。
然后使用promises.all(arrayOfPromises)执行它们并管理结果。
长期理解和维护会更容易。
查看承诺文档: