加载所有产品后使用Deferred

detas12

我有一个带有轮播的页面,每次幻灯片更改时,该页面都会发送ajax请求,并将与幻灯片相关的产品生成到底部的另一个轮播中。

在每张幻灯片更改后的那一刻,使用Ajax成功绘制了产品,尽管一旦加载了ajax请求,我就需要使用产品启动滑块。现在,滑块尝试在请求完成之前初始化。

在我添加的代码的底部,每个函数将每个getProducts函数添加到一个数组中,然后在完成后,它应该初始化滑块。尽管在控制台中,消息“此已初始化”发生在Ajax请求中的“成功”消息之前。

我是否在此示例中使用了延迟错误导致此问题?

        var products = [],
        uniqueProducts = [], 
        defs = [];           
        var el;
        $('.your-class [data-slick-index="' + currentSlide + '"] a').each(function(i) { 
              el = $(this).attr("href");      
              products.push(el);
              $.each(products, function(j, el) {
                  if ($.inArray(el, uniqueProducts) === -1)
                      uniqueProducts.push(el);
                      console.log("pushed" + uniqueProducts);
              });
        });
        function getProducts(el) {
          var def = new $.Deferred(); 
          var url = el;

          $.get(url, function(data) {  
                var imageArray = data.match(/<img itemprop="image" [\S\s]*?>/ig);
                var $image = $(imageArray[0]);
                var imageUrl = $image.attr('src');
                var name = $image.attr('title');
                var priceArray = data.match(/<p class="price">[\S\s]*?<\/p>/ig);
                var priceEl = $(priceArray[0]).find('[itemprop=price]');
                priceEl.children().remove();
                var price = priceEl.text() ? '$' + priceEl.text() : '';
                $( ".carousel2" ).append( '<div><img src=\" '+ imageUrl +'\"></div>');
                console.log("success");
                def.resolve();
          });
          return def.promise();
        }

      $.each(uniqueProducts, function(i, el) {
          defs.push(getProducts(el));
      });

      $.when($,defs).done(function () {
          $('.carousel2').slick({ speed: 500, autoplay: false, autoplaySpeed: 4000, arrows:false });
          console.log("this is initialized");
      });           
    } 
漫游者1888

有了这个答案,构建uniqueProducts将简化为两个单线。

var uniqueProducts = $('.your-class [data-slick-index="' + currentSlide + '"] a').map(function(el) {
    return $(el).attr('href');
}).get().filter(function(href, pos, self) {
    return self.indexOf(href) == pos;
});

getProducts()应简化如下:

function getProducts(url) {
    return $.get(url).then(function(data) {
        var image = $(data.match(/<img itemprop="image" [\S\s]*?>/ig)[0]);
        var price = $(data.match(/<p class="price">[\S\s]*?<\/p>/ig)[0]).find('[itemprop=price]').children().remove().end().text();
        return {
            name: image.attr('title'),
            image: image,
            price: price ? '$' + price : ''
        };
    });
}

注意,getProducts()现在没有副作用,但是返回一个数据对象。

然后,通过使用uniqueProducts.reduce(...),您可以调用getProducts() 处理Promise提供的数据。

假设一切都发生在一个函数中,您将得到如下结果:

function initializeCarousel() {
    return $('.your-class [data-slick-index="' + currentSlide + '"] a')
    .map(function(el) {
        return el.href;
    })
    .get()
    .filter(function(href, pos, self) {
        return self.indexOf(href) == pos;
    })
    .reduce(function(sequence, url) {
        var productPromise = getProducts(url);
        return sequence
        .then(function() {
            return productPromise;
        })
        .then(function(dataObj) {
            $(".carousel2").append(dataObj.image);
            // ... dataObj.name ...
            // ... dataObj.price ...
        }, function() {
            return sequence;//skip over error
        });
    }, $.when())//resolved starter promise for the reduction
    .then(function () {
        $('.carousel2').slick({ speed: 500, autoplay: false, autoplaySpeed: 4000, arrows:false });
        console.log("this is initialized");
    });
}

这种特殊的.reduce模式的特征是:

  • Ajax调用是并行进行的
  • 如果需要,可以非常简单地转换为串行调用。
  • 附加到圆盘传送带上的图像顺序将与缩小后的阵列一致,即“正确顺序”。
  • 任何单个的ajax错误都不会破坏整个企业。
  • 不需要中间promises数组或jQuery的繁琐代码$.when.apply(null, promises)(或.all()其他库中更友好的代码)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Python中的BeautifulSoup完全加载所有产品

来自分类Dev

如何使用Liquid(Shopify)遍历商店的所有产品?

来自分类Dev

woocommerce所有产品尺寸的列表

来自分类Dev

Magento小写所有产品标题

来自分类Dev

Mailchimp - 删除所有产品

来自分类Dev

抓取后如何将列表中所有产品的所有产品信息导出到csv中?

来自分类Dev

如何使用无形来迭代联产品中的所有产品类型?

来自分类Dev

Gradle Android插件:针对所有产品口味加入后编译任务

来自分类Dev

GraphQL,Shopify获取所有产品或产品总数

来自分类Dev

我没有使用Scrapy获得所有产品描述数据

来自分类Dev

使用Shopify API提取所有产品(超过50,000种)

来自分类Dev

尝试使用 Selenium 生成网站上所有产品的链接

来自分类Dev

得到所有产品,除了已经有折扣?

来自分类Dev

如何仅使用mysql在magento中提取所有产品ID,Skus,产品名称,说明?

来自分类Dev

如何从Android Studio构建所有产品口味?

来自分类Dev

对Magento中的所有产品享受折扣

来自分类Dev

Wordpress Woocommerce更改所有产品为缺货

来自分类Dev

打印数组的所有产品组合

来自分类Dev

如何在magento上显示所有产品图像

来自分类Dev

从表中获取所有产品并对其进行迭代

来自分类Dev

我可以搜索搜索中的所有产品吗?

来自分类Dev

Opencart seo url,用于查看所有产品页面

来自分类Dev

在magento主页中显示所有产品

来自分类Dev

如何从所有产品中仅删除组价?

来自分类Dev

所有产品的Magento更改属性

来自分类Dev

从父类别的django rest获得所有产品

来自分类Dev

WooCommerce我的帐户-下载:列出所有产品

来自分类Dev

通过WooCommerce按类别显示所有产品

来自分类Dev

显示Magento 2中的所有产品

Related 相关文章

  1. 1

    使用Python中的BeautifulSoup完全加载所有产品

  2. 2

    如何使用Liquid(Shopify)遍历商店的所有产品?

  3. 3

    woocommerce所有产品尺寸的列表

  4. 4

    Magento小写所有产品标题

  5. 5

    Mailchimp - 删除所有产品

  6. 6

    抓取后如何将列表中所有产品的所有产品信息导出到csv中?

  7. 7

    如何使用无形来迭代联产品中的所有产品类型?

  8. 8

    Gradle Android插件:针对所有产品口味加入后编译任务

  9. 9

    GraphQL,Shopify获取所有产品或产品总数

  10. 10

    我没有使用Scrapy获得所有产品描述数据

  11. 11

    使用Shopify API提取所有产品(超过50,000种)

  12. 12

    尝试使用 Selenium 生成网站上所有产品的链接

  13. 13

    得到所有产品,除了已经有折扣?

  14. 14

    如何仅使用mysql在magento中提取所有产品ID,Skus,产品名称,说明?

  15. 15

    如何从Android Studio构建所有产品口味?

  16. 16

    对Magento中的所有产品享受折扣

  17. 17

    Wordpress Woocommerce更改所有产品为缺货

  18. 18

    打印数组的所有产品组合

  19. 19

    如何在magento上显示所有产品图像

  20. 20

    从表中获取所有产品并对其进行迭代

  21. 21

    我可以搜索搜索中的所有产品吗?

  22. 22

    Opencart seo url,用于查看所有产品页面

  23. 23

    在magento主页中显示所有产品

  24. 24

    如何从所有产品中仅删除组价?

  25. 25

    所有产品的Magento更改属性

  26. 26

    从父类别的django rest获得所有产品

  27. 27

    WooCommerce我的帐户-下载:列出所有产品

  28. 28

    通过WooCommerce按类别显示所有产品

  29. 29

    显示Magento 2中的所有产品

热门标签

归档