【发布时间】:2014-05-21 07:51:28
【问题描述】:
我有一个简单的函数来拉入一组模板:
function getTemplates(names, done, templates, index) {
if (!index) index = 0;
if (!templates) templates = {};
if (index === names.length) return done(templates);
$.ajax({
url: '/templates/' + names[index] + '.min.html',
success: function (data, status, xhr) {
templates[names[index++]] = data;
return getTemplates(names, done, templates, index);
}
});
}
对我来说,从一个到下一个直到它们都被检索到,然后回调到调用函数,这似乎是合乎逻辑的。但我很好奇这样做是否有任何不良的副作用。到目前为止我还没有看到任何问题,但我不想在没有先了解任何潜在问题的情况下将其投入生产。
更新: 在 Google 和 BenjaminGruenbaum 的帮助下,我设计了一个解决方案:
function getTemplatesAsync(names, done) {
var calls = [];
var templates = {};
names.forEach(function (name, index) {
calls.push(
$.ajax({
url: '/templates/' + names[index] + '.min.html',
success: function (data, status, xhr) {
templates[names[index++]] = data;
}
})
);
});
$.when.apply($, calls).done(function () {
// using "templates" here feels fragile for some reason. Am I wrong?
return done(templates);
});
}
我在这里使用templates 是因为我需要能够按名称引用每个模板,但不知何故感觉它很脆弱或不可靠。这样做看起来安全吗?
【问题讨论】:
-
你最好在一个 ajax 请求中获取所有数据
-
虽然它看起来是递归的(我也为此使用术语递归 Ajax),但从技术上讲,您的函数在再次调用之前就退出了,所以实际上并不是递归的......也许我们应该称它们为“链式” ?阿贾克斯 :)
-
简单概括的答案是否定的,这不安全!原因是,Web 服务器可以并且确实通过多种方式限制同时连接的数量。因此,您在问题中绘制的场景可能会很好地测试,但在您上线时无法扩大规模。如果服务器在您的控制之下并且您理解它并且您确信它会扩展,那么一定要允许同时请求的洪流。但是,我的一般建议是让您的客户端脚本发出顺序请求。与服务器完全关闭相比,性能损失将是微不足道的!
-
@Roamer-1888,所以本杰明的回答似乎符合我的期望,但我的初始代码是最安全的方法。它按顺序处理所有请求,这对服务器的压力较小。
-
@Stephen,是的,这是我的观点,但前提是,正如我已经指出的那样,如果你可以设计一个测试策略来让你相信服务器可以承受压力,那么无论如何允许请求种子。
标签: jquery ajax recursion promise