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

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

要求:使用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楼 票数:0 已采纳

如果捕获了每个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()回调更好,因为它仍然允许请求并行执行,这可能会更快(尽管这在某种程度上取决于服务器,但这是一个单独的问题)。

  ask by Phillip Choi translate from so

未解决问题?本站智能推荐:

1回复

我的ajax调用函数完成后,如何*调用函数? [重复]

这个问题已经在这里有了答案: 带有可变参数的jQuery $ .when() 1个答案 我正在使用jQuery运行一些ajax: 我正在使用$.when ,但是我得到的是{}而不是我期望的数据。 当我在Chrome中设置断点时,在任何do_stuff调用之
2回复

如何确定所有ajax请求都已解决?

这是我的代码: 我这样调用该函数: 现在,我需要知道这两个ajax请求已完成。 我怎样才能做到这一点? 注意,我认为我必须使用promise.all() ,但是不确定在我的情况下如何使用它。
4回复

Ajax调用for循环,直到所有操作完成(错误或成功)

我正在for循环中进行AJAX调用,我想等到所有这些操作完成后再进行操作。 我正在尝试使用Promise,但是由于它不起作用,我缺少了一些东西。 如果触发了错误,则立即触发我的when呼叫,而我不想这样做。 我想等到所有呼叫完成,无论是成功还是错误。 完成所有调用后,我需要成功的
2回复

正确的方法以相同的完成功能运行多个相似的ajax调用,但输入数据有所不同

因此,我尝试将多个ajax请求发送到几乎相同的json的相同位置,但是每次都会发送不同的数据。 这是到目前为止,我将每个ajax请求添加到一个数组,然后尝试在该数组上运行$ .when,但没有任何反应。 我发誓我以前已经看过了,这就像完成的过程一样。 只是想知道运行这样的多个ajax调
2回复

AJAX递归回调完成

我有一个需要通过批处理过程删除的数据库。 如下代码所示,根据数据库的大小,可以有任意多个step (当前批处理迭代)。 我想将函数redirect_to_homepage()放在下面的代码中的某个位置,以便在上一个批处理过程之后将其重定向到新页面。 当前,它会在response.succe
1回复

jQuery / Ajax和何时/完成/承诺混乱

我正在尝试完成以下任务:1)获取数据的某些源并“对其进行处理”。 2)从其他来源获取数据并“使用它来做某事”。 3)数据获取最好以异步方式运行(同时,即第二个不应等待第一个完成)。 4)当两者都完成时,将运行一些业务逻辑-但仅当它们完成时才运行。 我创建了一个小JSFiddle,以显
1回复

通过多个AJAX请求填充数组,然后将数组传递给另一个函数

(我的解决方案如下) 我有几个带有.canvas-background类的HTML元素,其信息存储在数据库中。 我想获取每个元素的信息并通过JavaScript处理它。 但是我不能以某种方式将AJAX请求的响应传递给另一个函数。 这是我尝试过的: 在(1)我undefined
2回复

如何执行顺序的ajax调用?

我有一个按钮button1 ,一旦单击它就会重定向到URL www.first.com 。 该URL在其响应www.second.com包含另一个URL。 我使用ajax调用拦截请求,而不是重定向到www.first.com ,而是重定向到www.second.com 。 以下代码可以正常