0

我正在尝试构建一个迭代列表中每个项目的东西,获取一个产品 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 对象,即使是那些在上面的测试中失败的对象。有什么想法吗?

4

1 回答 1

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);
})

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

于 2013-08-14T19:32:39.110 回答