【问题标题】:Occasional fail from json requestjson请求偶尔失败
【发布时间】:2013-08-14 19:15:25
【问题描述】:

我正在尝试构建一个迭代列表中每个项目的东西,获取一个产品 sku,将该 sku 包含在一个 jsonp 请求中,希望返回一个对象。我有它,它可以做所有这些事情,但偶尔会失败。

所以这个脚本的例子是循环遍历列表元素,抓取类以获取正确的 id #,然后发送请求:

$j(document).ready(function(){
    $j('ul.products-grid li a.product-image img').each(function(index){
        var prodId = $j(this).attr('class').match(/[\d]+$/),
            s7jsonReqUrl = '/is/image/z/' + prodId + '/?req=imageset,json';
        $j.ajax({
                 url: s7jsonReqUrl,                         
                      dataType: 'jsonp',
                      jsonp: 'true',
                      jsonpCallback: 's7jsonResponse',
                      success: function(response)
                      {                
                        x = response["IMAGE_SET"];  
                        console.log(x);
                      }, 
                      error: function(data, status)
                      {
                        console.log ( 'error : ' + data + ' : ' + status );
                      }
                 });
              });
            })

如果我要获取这些 url 并手动将它们粘贴到浏览器中(来自 s7jsonReqUrl var 的那些),它们将返回预期的 json 对象,即使是那些在上面的测试中失败的对象。有什么想法吗?

【问题讨论】:

  • 您正在发送 n 个请求,都希望使用完全相同的 jsonp 回调。这是自找麻烦。

标签: jquery ajax json jsonp


【解决方案1】:

由于 jQuery 反复定义和重新定义 s7jsonResponse,您很可能会遇到竞态条件。

我会以非 jquery 方式执行此操作,因为回调参数不是动态的..

window.s7jsonResponse = function(data) {
    console.log(data);
};

var sendForJSON = function (prodId) {
    var s = document.createElement("script");
    s.src = '/is/image/z/' + prodId + '/?req=imageset,json';
    document.body.appendChild(s);
};

现在只需使用sendForJSON 获取数据。

.each(function(){
    var prodId = $j(this).attr('class').match(/[\d]+$/);
    sendForJSON(prodId);
})

可能还应该添加逻辑以在收到响应后删除脚本标签。

【讨论】:

  • 谢谢凯文!这很有帮助。我已经再次陷入困境,并认为我会把它扔在这里看看你是否有任何想法(尽管可能需要再发一篇 SO 帖子)。所以我现在可以为该列表中的每个项目获取我想要的变量。欢呼!现在我需要在 .each 中最初迭代的每个项目之后附加该 var(来自 json 响应)。我迷路了..因此,如果我将类名的另一个参数传递给该追加的目标,我将如何执行它?从window.s7jsonResponse函数??感谢您提供更多帮助或想法。
  • 您可以从返回的数据中提取 prodId,然后使用它来获取原始元素
  • 很酷,是的,我正在研究类似的想法。有时问这个问题可以帮助我思考问题。再次感谢您的帮助!
猜你喜欢
  • 2018-08-08
  • 1970-01-01
  • 2018-07-04
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2018-04-09
  • 1970-01-01
相关资源
最近更新 更多