偶尔从json请求失败

时间:2013-08-14 19:15:25

标签: jquery ajax json jsonp

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

所以循环遍历列表元素的脚本示例,抓取类以获取正确的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 );
                      }
                 });
              });
            })

如果我将这些网址中的每一个都手动粘贴到浏览器中(来自s7jsonReqUrl var),它们将返回预期的json对象,即使是那些因上述测试失败的对象。任何想法在这里发生了什么?

1 个答案:

答案 0 :(得分: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);
})

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