Javascript 帮助在ajax回调函数之间传递变量
好的,我正在构建一个东西,它向一台服务器发出ajax请求,在服务器上确定它需要的url,然后向另一个地方发出新的ajax请求。多亏了SO=)的所有帮助,一切都进展顺利。。但是我又被卡住了。我正在努力让变量返回到我需要的不同函数。第二个(jsonp)请求返回一个json函数,如下所示:Javascript 帮助在ajax回调函数之间传递变量,javascript,xml,json,function,variables,Javascript,Xml,Json,Function,Variables,好的,我正在构建一个东西,它向一台服务器发出ajax请求,在服务器上确定它需要的url,然后向另一个地方发出新的ajax请求。多亏了SO=)的所有帮助,一切都进展顺利。。但是我又被卡住了。我正在努力让变量返回到我需要的不同函数。第二个(jsonp)请求返回一个json函数,如下所示: jsonResponse( {"it.exists":"1"},""); 我的代码 var img = "null"; var z = "null"; $(document).ready(function()
jsonResponse(
{"it.exists":"1"},"");
我的代码
var img = "null";
var z = "null";
$(document).ready(function()
{
$.ajax({
type: "GET",
url: "connect.php",
dataType: "xml",
success: function parseXml(data)
{
$(data).find("ITEM").each(function()
{
query = $("SKU", this).text();
query = 'http://domain.com/' + query + '?req=exists,json';
img = $("SKU", this).text();
img = '<img src="http://domain.com/' + img + '">';
var date =$("LAST_SCAN" , this).text();
$.ajax({
url: query,
dataType: 'jsonp'
});
$("table").append('<tr>'+'<td>' + (date) + '</td>' + '<td>' + (z) + '</td>');
});
}
});
});
// function required to interpret jsonp
function jsonResponse(response){
var x = response["it.exists"];
// console.log(x);
if (x == 0) {
console.log("NO");
var z = "NO IMG";
}
if (x == 1) {
console.log(img);
//this only returns the first image path from the loop of the parseXml function over and over
var z = (img);
}
return z;
}
var img=“null”;
var z=“null”;
$(文档).ready(函数()
{
$.ajax({
键入:“获取”,
url:“connect.php”,
数据类型:“xml”,
成功:函数parseXml(数据)
{
$(数据)。查找(“项”)。每个(函数()
{
query=$(“SKU”,this).text();
查询='http://domain.com/“+query+”?req=exists,json';
img=$(“SKU”,this).text();
img=“”;
var date=$(“最后一次扫描”,this).text();
$.ajax({
url:query,
数据类型:“jsonp”
});
$(“表格”)。附加(“”+“”+(日期)+“”+“”+“”+(z)+“”);
});
}
});
});
//解释jsonp所需的函数
函数jsonResponse(response){
var x=响应[“它存在”];
//控制台日志(x);
如果(x==0){
控制台日志(“否”);
var z=“无IMG”;
}
如果(x==1){
控制台日志(img);
//这只会反复返回来自parseXml函数循环的第一个图像路径
var z=(img);
}
返回z;
}
所以我想我的问题是两方面的。。一个方法是如何让img变量循环到if语句中,然后一旦成功,如何返回z变量以在第一个xml解析器中使用?将“date”存储在全局变量中,并将逻辑移动到将HTML元素附加到jsonResponse函数中。您无法从jsonResponse返回控制流,因为它是异步调用的,但您可以继续从该函数执行任何操作。尝试这种同步方法:
var itemQueue = [];
$(document).ready(function ()
{
$.ajax({
type: "GET",
url: "connect.php",
dataType: "xml",
success: function parseXml(data)
{
itemQueue= $(data).find("ITEM").map(function ()
{
return {
sku: $("SKU", this).text(),
date: $("LAST_SCAN", this).text()
};
}).get();
getNextItem();
}
});
});
function getNextItem()
{
var item = itemQueue[0];
var query = "http://domain.com/" + item.sku + "?req=exists,json";
$.ajax({
url: query,
dataType: 'jsonp'
});
}
function jsonResponse(response)
{
var item = itemQueue.shift();
if (itemQueue.length)
{
getNextItem();
}
var x = response["it.exists"];
var z = x == "0" ? "NO IMG" : "<img src=\"http://domain.com/" + item.sku + "\">";
$("table").append("<tr><td>" + item.date + "</td><td>" + z + "</td>");
}
var itemQueue=[];
$(文档).ready(函数()
{
$.ajax({
键入:“获取”,
url:“connect.php”,
数据类型:“xml”,
成功:函数parseXml(数据)
{
itemQueue=$(数据).find(“ITEM”).map(函数()
{
返回{
sku:$(“sku”,this).text(),
日期:$(“上次扫描”,此).text()
};
}).get();
getNextItem();
}
});
});
函数getNextItem()
{
var item=itemQueue[0];
变量查询=”http://domain.com/“+item.sku+”?请求=存在,json”;
$.ajax({
url:query,
数据类型:“jsonp”
});
}
函数jsonResponse(response)
{
var item=itemQueue.shift();
if(itemQueue.length)
{
getNextItem();
}
var x=响应[“它存在”];
var z=x==“0”?“无IMG”:“;
$(“表”).append(“+item.date+”+z+”);
}
您的代码缩进不良,缺少一些右大括号(}
),并且有额外的分号(;
)。这使得你很难理解你的代码和你想做什么。好吧,我清理了它,希望它不会那么混乱……JSONP回调必须命名为“jsonResponse”吗?或者您可以在请求中指定回调名称吗?通常,您会在JSONP请求中指定回调名称,但我看不到您在这里这样做。。它被包装在函数jsonResponse中,正如我在问题的顶部所示。。哎呀,它被删掉了。。我会把它加回去。我得到了有效的答复。。因此,它使用从第一个parseXML定义的url遍历每个请求,并返回1或0。然后我可以定义变量并在控制台中查看它们。。我只是不知道如何将它们返回到原始函数我想知道封装服务器返回的json的函数的名称。典型的jsonp请求url类似于http://foo.org/request?sku=12345&callback=jsonResponse
。你是说你没有在url中把函数名“jsonResponse”传递给服务器吗?如果不是的话,对你来说就更难了。您必须实现一个队列,一次处理一个队列,等待每个请求完成,然后再移动到下一个队列,从而使请求同步。太棒了!非常感谢你!