繁体   English   中英

如何遍历多个Ajax请求,然后在所有步骤完成后执行代码? [重复]

How can I loop over over multiple ajax requests, and then execute code after everything has been complete? [duplicate]

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

这个问题已经在这里有了答案:

首先,我要说我已经在网上进行了一系列搜索,但似乎无法将它们拼凑在一起。

要求:使用jQuery :(

点击时,我正在使用.getJSON调用来获取具有多层的对象。

这是数据示例:

 myObj = {
title: 'some name',
items: [
    {
        name: 'item-1',
        url: '/item-1'
    },
    {
        name: 'item-2',
        url: '/item-4'
    },
    {
        name: 'item-3',
        url: '/item-4'
    },
    {
        name: 'item-4',
        url: '/item-4'
    },
]

}

我想遍历所有URL,并在它们上调用.ajax操作,然后将返回的新数据存储在它们各自的对象中。

它看起来像这样:

myObj = {
title: 'some name',
items: [
    {
        name: 'item-1',
        url: '/item-1',
        properties: {//whole new set of data from url}
    },
    {
        name: 'item-2',
        url: '/item-4',
        properties: {//whole new set of data from url}
    },
    {
        name: 'item-3',
        url: '/item-4',
        properties: {//whole new set of data from url}
    },
    {
        name: 'item-4',
        url: '/item-4',
        properties: {//whole new set of data from url}
    },
]

}

完成所有这些操作后,每个对象都有新的数据,然后我想对myObj ,例如将其渲染到jquery模板(ugh),但是新数据必须位于每个项目的内部。

这是我到目前为止的内容:

var myItems = myObj.items;
$(myItems).each(function(index, item) {    
      var itemUrl = '/somestuff/' + item.url + '.js';
      $.getJSON(itemUrl).done(function(itemData) {
        item.data = itemData;                    
      });
    }).promise().done(function() {//render data to template})

我唯一的问题是,有时在模板渲染时数据还不存在( item.properties ),因此无法渲染未定义。

我尝试链接.done()失败,现在遇到了使用.when() ,但是不知道如何编写代码来使.when()正常工作。

感谢您的帮助,我很乐意澄清细节。

1 个回复

如果捕获了每个AJAX请求生成的Promise(实际上是技术上是jQuery Deferred对象),并将它们添加到数组中,那么一旦所有Promises都解决了,您可以调用.when()来执行一些代码。 像这样(未经测试):

var myItems = myObj.items;
var promises = [];
$(myItems).each(function(index, item) {    
  var itemUrl = '/somestuff/' + item.url + '.js';
  var p = $.getJSON(itemUrl);
  p.then(function(itemData) {
    item.data = itemData;
    return itemData;
  });
  promises.push(p);
});

$.when.apply($, promises).then(function() { //render data to template...

这可能比链接done()回调更好,因为它仍然允许请求并行执行,这可能会更快(尽管这在某种程度上取决于服务器,但这是一个单独的问题)。

2 使用递归函数依次处理多个ajax请求,并在所有请求完成后执行回调函数

我有用逗号分隔的名称列表。 我想要的是我要为序列中的所有名称调用服务器请求并将结果存储在数组中。 我试过了,当我确实有很多名字存在于字符串中时,它就起作用了。 请参阅此处 -当我知道名字数量时,此方法有效 现在我想要的是使此代码通用。 如果我在该字符串中添加一个名称,它将自动处 ...

3 其他所有步骤完成后运行NUnit测试

我有一种情况(下面详细介绍),在所有其他测试完成后,我想运行一个NUnit测试。 我知道我可以使用order属性以某种顺序启动测试,但是在这种情况下: 我只想归因于(或更改)几百个测试中的一个。 我希望此测试最后运行,而不是首先运行。 我希望此测试在所有其他测试完成后 ...

2019-03-20 15:13:34 1 23   nunit
4 所有ajax请求完成后执行代码

我有一个非常复杂的搜索,利用多个ajax调用,流程如下: 这一切都很好,我想做的是在div中显示加载消息并禁用搜索按钮,然后当所有ajax请求完成后重新启用按钮并删除加载消息。 我的脚本在下面,此时按钮的禁用/重新显示几乎瞬间发生,我认为因为ajax调用是asyncronus,我如 ...

6 按顺序处理项目列表,并在所有步骤完成后返回“确定”(异步->同步)

我对诺言和异步过程的概念感到头疼。 我已经订购了一个列表,并且想对每个项目都调用一个函数,等到第一个项目的第一个过程完成后,再进行第二,第三次等等。 而且只有在处理完每个项目之后,我才想继续主要过程。 以下是使主流程变得完美的代码。 因此,返回Q.all(promises)导致首先处 ...

10 在所有axios请求完成后运行vuejs代码

在这里,仅在所有axios请求完成后才需要运行carResult函数。 将其添加到method2成功中将不起作用,因为组件两次运行了该代码。 如果有人可以在所有axios请求之后都可以使用vue代码帮助我,那将是非常有帮助的。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM