使用包含 jQuery AJAX 调用的普通 JS 函数返回 HTML/JSON?
我知道这在“技术上”是无法完成的,因为 AJAX 是异步的,但我正在开发的一个应用程序有很多 AJAX API 调用,我正在尝试使其可以为未来的前端开发人员扩展。
我知道你可以将所有内容都嵌套在回调中,但这会非常丑陋,更不用说下一个想要扩展它的开发人员不知道该怎么做。
因此,例如,这是我的代码(当然,它不起作用,只是返回未定义
,但这里是我想要的示例逻辑上工作):
var getCategories = function(type){
var categories;
$.get('/api/categories/all',function(json){
if(type == 'html'){
categories = '';
for(x in json.data){
categories=categories+'<option id="category_'+json.data[x].category_id+'" title="'+json.data[x].description+'">'+json.data[x].category+'</option>'
}
}
else{ //JSON
categories = json.data;
}
return categories;
});
}
稍后开发人员可能想以这种方式使用它: $('div').html('');
我怎样才能让这个工作像这样呢?我可以使用一些 JS 技巧吗?还是我创建的每个函数都必须有一个像 getCategories('html',function(){})
这样的回调?
如果一切都需要回调,那么对于制作一个带有大量 AJAX 调用的主要 JS 应用程序,您有什么建议可以轻松扩展吗?
更新
根据请求,如果开发人员想要对标签、类别和帖子进行某些操作,这对他来说将是一件痛苦的事情:
//Some event on click
$('.button').click(function(){
$.ajax({
url: "/api/categories/all",
success: function(json){
categories = '';
for(x in json.data){
categories=categories+'<option id="category_'+json.data[x].category_id+'" title="'+json.data[x].description+'">'+json.data[x].category+'</option>'
}
$.ajax({
url: "/api/tags/all",
success: function(json){
tags = '';
for(x in json.data){
tags=tags+'<option id="tags_'+json.data[x].category_id+'" title="'+json.data[x].description+'">'+json.data[x].category+'</option>'
}
$.ajax({
url: "/api/posts/all",
success: function(json){
posts = '';
for(x in json.data){
posts=posts+'<option id="posts_'+json.data[x].category_id+'" title="'+json.data[x].description+'">'+json.data[x].category+'</option>'
}
//And so on...
//after getting all this data that the developer might want
//to put this in a modal to edit these items...
}
});
}
});
}
});
});
//On load tho, on the same page, he might want to list "popular" categories, tags, all, and he'd
//have to copy and paste the above code but change, all to popular
//Im looking to make a JS API almost to make this simpler, LIKE:
var tags = goGet('tags','popular');
var categories = gotGet('categoties','all');
//etc
I know this "technically" can't be done as AJAX is async, but an app I'm working on has a lot of AJAX API calls and I'm trying to make this extendable for future front-end devs.
I know you can just nest everything in callbacks, but that'd be super ugly and not to mention the next dev coming along wanting to extend it wont know what to do.
So, for example, here is my code (that, of course, doesn't work and just returns undefined
, but here for an example of how i'd like it to logically work):
var getCategories = function(type){
var categories;
$.get('/api/categories/all',function(json){
if(type == 'html'){
categories = '';
for(x in json.data){
categories=categories+'<option id="category_'+json.data[x].category_id+'" title="'+json.data[x].description+'">'+json.data[x].category+'</option>'
}
}
else{ //JSON
categories = json.data;
}
return categories;
});
}
And later on a dev might want to use it in this way:$('div').html('<select>'+getCategories('html')+'</select>');
How could I make this work like that? Can I with some JS trick or would every function I make like this HAVE to have a callback like, getCategories('html',function(){})
?
If it's everything needs a callback, do you have any tips on making a mostly JS app w/ lots of AJAX calls easily extendable?
UPDATE
As per request, this would be a pain in the ass for a developer if he wanted to do something with, lets say, tags, categories, and posts:
//Some event on click
$('.button').click(function(){
$.ajax({
url: "/api/categories/all",
success: function(json){
categories = '';
for(x in json.data){
categories=categories+'<option id="category_'+json.data[x].category_id+'" title="'+json.data[x].description+'">'+json.data[x].category+'</option>'
}
$.ajax({
url: "/api/tags/all",
success: function(json){
tags = '';
for(x in json.data){
tags=tags+'<option id="tags_'+json.data[x].category_id+'" title="'+json.data[x].description+'">'+json.data[x].category+'</option>'
}
$.ajax({
url: "/api/posts/all",
success: function(json){
posts = '';
for(x in json.data){
posts=posts+'<option id="posts_'+json.data[x].category_id+'" title="'+json.data[x].description+'">'+json.data[x].category+'</option>'
}
//And so on...
//after getting all this data that the developer might want
//to put this in a modal to edit these items...
}
});
}
});
}
});
});
//On load tho, on the same page, he might want to list "popular" categories, tags, all, and he'd
//have to copy and paste the above code but change, all to popular
//Im looking to make a JS API almost to make this simpler, LIKE:
var tags = goGet('tags','popular');
var categories = gotGet('categoties','all');
//etc
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
关于你的例子。
代码中有三个 ajax 请求,它们都不相互依赖。因此,没有理由按顺序执行它们。
至于
goGet
,它也可以轻松回调。如果你想在所有数据加载后执行代码,你可以在里面使用计数器。
您可以概括此回调函数,而不是多次声明它。
更简单一点:顺序获取数据。
Regarding your examples.
You have three ajax requests in the code and none of them are dependent on each other. So, no reason to execute them sequentially.
As for
goGet
, it can also take callback easily.If you want to execute code after all data loaded, you can use counter inside.
You can generalize this callback function, to not declare it multiple times.
A bit simpler: fetch data sequentially.