javascript - 如何使用 jquery .when 访问 json 数据以附加到页面?

标签 javascript jquery html arrays json

我正在创建该函数,该函数在页面上的数据属性中查找 url,然后找到 data-url 对象,获取该页面的 url,并从该页面访问 json 并将其附加到动态 slider 中。

渲染时数据网址如下所示:

<ul id="data-urls" style="display: none;">

    <li data-number="1" data-title="life-is-light" data-url="/pages/life-is-light"></li>

    <li data-number="2" data-title="our-biodynamics" data-url="/pages/our-biodynamics"></li>

    <li data-number="3" data-title="winemaking" data-url="/pages/winemaking"></li>

    <li data-number="4" data-title="our-land" data-url="/pages/our-land"></li>

    <li data-number="5" data-title="the-people" data-url="/pages/the-people"></li>

</ul>

我创建了一个使用 $.each 循环来启动它的函数,但遇到了将 $.get 中的附加项目添加到随机顺序,而不是根据上面的列表,该列表始终按顺序排列。这是我创建的内容以及导致问题的原因:

$.each( $("#data-urls li") , function () {

  var dataUrl = $(this).attr('data-url');
  var dataTitleObj = $(this).attr('data-title');

  $.get( dataUrl, function( data ) {
$.each(data, function(i, item) {
  var body = data[i].body_html,title = data[i].title,id = data[i].handle,orderNum = data[i].id;
  $('.page-holder').append('<section data-order="" id="'+ id +'" href="#'+ id +'" class="big-stretch active"><figure class="inner"><div class="inner-stretch"><div class="box"><h1 class="">'+ title +'</h1><hr class="style-line"><p class="">'+ body +'</p></div></div></figure></section>');
  timber.largeImageResize();
});



  console.log(data);

  }, 'json').done(function() {

var h1 = $('#life-is-light .inner .inner-stretch h1');
var text = h1.text().split(' ');

for( var i = 1, len = text.length; i < len; i=i+2 ) {
    text[i] = '<span class="italic">' + text[i] + '</span>';
}
h1.html(text.join(' '));

  });

});

这会附加正确的项目,但有时它们在页面刷新时以错误的顺序显示,这不一致。所以我然后想出了使用 $.when 但我正在努力的是在上面的函数上我可以用这个 }, 'json').done(function() { 使用 $.when 没有简单的方法可以做到这一点,当我在上述函数之后执行 console.log(data); 时,我得到这个:

Object {page: Object}
page: Object 
author: "Kat Wiggins"
body_html: "Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Nulla vitae elit libero, a pharetra augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit."
created_at: "2014-11-05T10:51:14-05:00"
handle: "our-biodynamics"
id: 22933611
published_at: "2014-11-05T10:50:00-05:00"
title: "Our Biodynamics"
updated_at: "2014-11-05T10:53:11-05:00"

我想使用的新函数是 $.when:

$.when.apply(null, $.map($("#data-urls li"), function(elm) { return $.get($(elm).data('url')); }) ).then(function(responses) {
    $.each(responses, function(data) {
    });
});

如何使用上述函数获得与原始函数完全相同的效果,而不尝试在页面刷新时重新排序 html,并成功正确获取数据?

最佳答案

你的代码几乎没问题。唯一的问题是,当您将多个 Promise 传递给 $.when 时那么相应的响应将不以数组的形式提供,而是作为单独的参数提供。这就是为什么在您的代码中 responses 确实指的是第一个响应。

尝试以这种方式迭代它们:

var promises = $("#data-urls li").map(function() { 
    return $.get($(this).data('url')); 
});

$.when.apply(null, promises).then(function() {
    var responses = [].slice.call(arguments);
    $.each(responses, function(i, data) {
        console.log(data[0]); // json response
    });
});

关于javascript - 如何使用 jquery .when 访问 json 数据以附加到页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27484559/

相关文章:

javascript - 删除div并带有漂亮的动画

javascript - Google Analytics 事件跟踪应该触发 XHR 请求吗?

jquery - 页面加载后如何制作动画

javascript - Ext Component 查询选择器格式和选项

html - FF 中格式不正确的错误消息

javascript - 当我们有多个过滤器时,AngularJS 过滤器对数据进行 "OR"操作

javascript - 添加不同颜色的 Gridster 小部件

jquery - 在鼠标悬停事件上切换图像的最佳方式是什么?

html - 单击纯 css 时转到特定的 Accordion 选项卡

javascript - 在 React 中从另一个文件调用 JS 函数?