我使用JQuery $ .ajax循环一组JSON URL并将结果下载到数组中。一些URL返回404 - 我正在处理和显示为div消息。
但是,我似乎无法传递URL,更确切地说,它总是只传递数组中的最后一个URL。
我认为这是因为ajax是异步的并且需要更长时间才能完成,但我不确定如何确保只在SUCCESS或ERROR上显示当前的JSON url(或变量)
我的代码:
// For every URL loop through 'baseitems' array
for (var i = 0; i < baseitems.length; i++) {
// This is where I'm hoping to store the current URL as a variable to pass to the end-user on Success or Error
var caturl = baseURL + "/" + baseitems[i];
// Get the data via JSON
$.ajax({
type: "GET",
url: caturl,
dataType: "json",
async: true, // set so that the variables caturl get updated below
success: function (result) {
// Success: store the object into catalog array
cat.unshift(result);
$('#showdata').prepend("Loaded: " + caturl + "</br>"); // still buggy here - probably async JSON issue
},
error: function (xhr, textStatus, error) {
// Error: write out error
console.log(xhr.statusText);
console.log(textStatus);
console.log(error);
$('#showdata').prepend("ERROR : '" + error + "' trying to access: " + caturl + "</br>"); // still buggy here - probably async JSON issue
}
});
}
**更新:工作代码**
使用@charlietfl帮助完成的工作代码+一些好的东西,如成功/错误代码+加载的URL数量如下。谢谢charlietfl&amp;调停!
$.ajax({
type: "GET",
url: caturl,
dataType: "json",
async: true, // set so that the variables caturl get updated below
beforeSend: function (jqXHR, settings) {
/* add url property and get value from settings (or from caturl)*/
jqXHR.url = settings.url;
},
success: function (result, textStatus, jqXHR) {
// Success: store the object into catalog array
var url = jqXHR.url;
cat.unshift(result);
$('#showdata').prepend("<font size=\"1\">Loading: " + url + " status: " + textStatus + "</font></br>");
successcount += 1;
},
/* error to be deprecated in jQuery 1.8 , superseded by "fail" */
error: function (jqXHR, textStatus, error) {
var url = jqXHR.url;
/* replace caturl with url in your append */
$('#showdata').prepend("<font size=\"1\" color=\"red\">ERROR : '" + error + "' trying to access: " + url + "</font></br>");
},
complete: function (jqXHR, textStatus) {
$('#showdata').prepend("<font size=\"3\">Loaded <b>" + successcount + "</b> of " + baseitems.length + " total catalogs.</font></br>")
}
});
答案 0 :(得分:13)
这是一种方法。 beforeSend
回调选项使您可以访问jqXHR对象和ajax设置对象。
您将无法在错误附加中使用caturl
,因为它不会与请求投掷错误同步。
$.ajax({
/* url, data ...& other opts*/
beforeSend:function( jqXHR, settings){
/* add url property and get value from settings (or from caturl)*/
jqXHR.url= settings.url;
},
/* error to be deprecated in jQuery 1.8 , superseded by "fail" */
error: function(jqXHR, , textStatus, error){
var url=jqXHR.url;
/* replace caturl with url in your append */
$('#showdata').prepend("ERROR : '" + error + "' trying to access: " + url + "</br>");
}
编辑:根据第三方API评论,重要的是要直接从$.ajax API
中识别以下内容从远程服务器检索数据时(只能使用脚本或jsonp数据类型),永远不会触发错误回调和全局事件。
答案 1 :(得分:0)
我建议只是从服务器传回URL,伪PHP就像:
function function_called_by_ajax()
{
//processing...
echo json_encode(array('urlString'=>$urlString));
}
现在你的ajax成功了,你可以得到字符串,就像这个伪js:
success: function (result) {
var caturl = result.urlString;
// Success: store the object into catalog array
cat.unshift(result);
$('#showdata').prepend("Loaded: " + caturl + "</br>");
}