jquery和ajax的javascript范围问题
我有一个函数,可以对bartapi进行jqueryajax调用,以获得接下来的一系列列车。该函数应返回下一列车发车的字符串:jquery和ajax的javascript范围问题,javascript,jquery,ajax,variables,scope,Javascript,Jquery,Ajax,Variables,Scope,我有一个函数,可以对bartapi进行jqueryajax调用,以获得接下来的一系列列车。该函数应返回下一列车发车的字符串: function getNextTrain(station) { var returnString = ""; var title = station.title; $.ajax({ type:"GET", url:"http://api.bart.gov/api/etd.aspx?cmd=etd&o
function getNextTrain(station)
{
var returnString = "";
var title = station.title;
$.ajax({
type:"GET",
url:"http://api.bart.gov/api/etd.aspx?cmd=etd&orig="+title+"&key=2BDD-I3UG-U3L6-ZNK2",
dataType:"xml",
success: function(xml){
$(xml).find("estimate").each(function(){
returnString += "-------------------<br>"
+"Train: " + $(this).find("color").text() + "<br>"
+"Direction: " + $(this).find("direction").text() + "<br>"
+"ETD: " + $(this).find("minutes").text() + " minutes<br>";
});
// console.log(returnString);
}
});
return returnString;
}
函数getNextTrain(站)
{
var returnString=“”;
var title=station.title;
$.ajax({
键入:“获取”,
url:“http://api.bart.gov/api/etd.aspx?cmd=etd&orig=“+title+”&key=2BDD-I3UG-U3L6-ZNK2”,
数据类型:“xml”,
成功:函数(xml){
$(xml).查找(“估计”).each(函数(){
returnString+=“------------------------
”
+火车:“+$(此).find(“颜色”).text()+”
“
+“方向:”+$(此).find(“方向”).text()+”
”
+“ETD:”+$(this).find(“分钟”).text()+“分钟
”;
});
//console.log(returnString);
}
});
返回字符串;
}
如果我在$(xml).find(“estimate”)之后将字符串转储到控制台。每个(…)的右括号(当前已注释掉)-字符串是正确的:
-------------------<br>Train: BLUE<br>Direction: South<br>ETD: 4 minutes<br>------------`-------<br>Train: GREEN<br>Direction: South<br>ETD: 12 minutes<br>-------------------<br>Train: BLUE<br>Direction: South<br>ETD: 19 minutes<br>-------------------<br>Train: BLUE<br>Direction: North<br>ETD: 11 minutes<br>-------------------<br>Train: BLUE<br>Direction: North<br>ETD: 26 minutes<br>-------------------<br>Train: BLUE<br>Direction: North<br>ETD: 41 minutes<br>-------------------<br>Train: GREEN<br>Direction: North<br>ETD: 3 minutes<br>-------------------<br>Train: GREEN<br>Direction: North<br>ETD: 18 minutes<br>-------------------<br>Train: GREEN<br>Direction: North<br>ETD: 33 minutes<br>-------------------<br>Train: RED<br>Direction: South<br>ETD: 8 minutes<br>-------------------<br>Train: RED<br>Direction: South<br>ETD: 23 minutes<br>-------------------<br>Train: RED<br>Direction: South<br>ETD: 37 minutes<br>-------------------<br>Train: YELLOW<br>Direction: North<br>ETD: 14 minutes<br>-------------------<br>Train: YELLOW<br>Direction: North<br>ETD: 29 minutes<br>-------------------<br>Train: YELLOW<br>Direction: North<br>ETD: 44 minutes<br>-------------------<br>Train: RED<br>Direction: North<br>ETD: 6 minutes<br>-------------------<br>Train: RED<br>Direction: North<br>ETD: 22 minutes<br>-------------------<br>Train: RED<br>Direction: North<br>ETD: 37 minutes<br>-------------------<br>Train: YELLOW<br>Direction: South<br>ETD: Arrived minutes<br>-------------------<br>Train: YELLOW<br>Direction: South<br>ETD: 15 minutes<br>-------------------<br>Train: YELLOW<br>Direction: South<br>ETD: 30 minutes<br>`
--------------
列车:蓝色
方向:南
ETD:4分钟
--------------
列车:绿色
方向:南
ETD:12分钟
--------------
列车:蓝色
方向:南
ETD:19分钟
--------------
列车:蓝色
方向:北
ETD:11分钟
--------------
列车:蓝色
方向:北
ETD:26分钟
列车:蓝色
方向:北
ETD:41分钟
列车:绿色
方向:北
ETD:3分钟
列车:绿色
方向:北
ETD:18分钟
列车:绿色
方向:北
ETD:33分钟
-------------------
列车:红色
方向:南
ETD:8分钟
列车:红色
方向:南
ETD:23分钟
列车:红色
方向:南
ETD:37分钟
列车:黄色
方向:北
ETD:14分钟
列车:黄色
>方向:北
ETD:29分钟
列车:黄色
方向:北
ETD:44分钟
列车:红色
方向:北
ETD:6分钟
列车:红色
方向:北
ETD:22分钟
列车:红色
方向:北
ETD:37分钟
-------------------
列车:黄色
方向:南
ETD:到达分钟
列车:黄色
方向:南
ETD:15分钟
列车:黄色
方向:南
ETD:30分钟
`
但是当我返回它(或者在return语句所在的位置记录它)时,我得到一个空字符串。
我试过:
-在函数外部声明全局变量
-使用concat()函数
-在我成功记录字符串的位置返回
无论我做什么,当我在调用函数中查看返回值时,都会得到一个空字符串。我已被阻止数小时,不知道自己做错了什么。我感谢任何帮助!这是因为默认情况下ajax是异步的。如果要从此方法返回内容,必须将async设置为false
$.ajax({
type:"GET",
url:"http://api.bart.gov/api/etd.aspx?cmd=etd&orig="+title+"&key=2BDD-I3UG-U3L6-ZNK2",
dataType:"xml",
async: false,
success: function(xml){
$(xml).find("estimate").each(function(){
returnString += "-------------------<br>"
+"Train: " + $(this).find("color").text() + "<br>"
+"Direction: " + $(this).find("direction").text() + "<br>"
+"ETD: " + $(this).find("minutes").text() + " minutes<br>";
});
// console.log(returnString);
}
});
$.ajax({
键入:“获取”,
url:“http://api.bart.gov/api/etd.aspx?cmd=etd&orig=“+title+”&key=2BDD-I3UG-U3L6-ZNK2”,
数据类型:“xml”,
async:false,
成功:函数(xml){
$(xml).查找(“估计”).each(函数(){
returnString+=“------------------------
”
+火车:“+$(此).find(“颜色”).text()+”
“
+“方向:”+$(此).find(“方向”).text()+”
”
+“ETD:”+$(this).find(“分钟”).text()+“分钟
”;
});
//console.log(returnString);
}
});
。不会立即调用success
。只有当Ajax请求成功返回时才会调用它。您需要有一个全局变量,并从success回调中将其设置为有效
更好的方法是(因为全局变量是邪恶的),使用回调:
function printListofStations(list) {
console.log(returnString);
}
function getNextTrain(station, printListofStations)
{
var returnString = "";
var title = station.title;
$.ajax({
type:"GET",
url:"http://api.bart.gov/api/etd.aspx?cmd=etd&orig="+title+"&key=2BDD-I3UG-U3L6-ZNK2",
dataType:"xml",
success: function(xml){
$(xml).find("estimate").each(function(){
returnString += "-------------------<br>"
+"Train: " + $(this).find("color").text() + "<br>"
+"Direction: " + $(this).find("direction").text() + "<br>"
+"ETD: " + $(this).find("minutes").text() + " minutes<br>";
printListofStations(returnString);
});
}
});
}
函数printListofStations(列表){
console.log(returnString);
}
函数getNextTrain(station、printListofStations)
{
var returnString=“”;
var title=station.title;
$.ajax({
键入:“获取”,
url:“http://api.bart.gov/api/etd.aspx?cmd=etd&orig=“+title+”&key=2BDD-I3UG-U3L6-ZNK2”,
数据类型:“xml”,
成功:函数(xml){
$(xml).查找(“估计”).each(函数(){
returnString+=“------------------------
”
+火车:“+$(此).find(“颜色”).text()+”
“
+“方向:”+$(此).find(“方向”).text()+”
”
+“ETD:”+$(this).find(“分钟”).text()+“分钟
”;
printListofStations(返回字符串);
});
}
});
}
是的,我觉得自己像个白痴,但这解决了问题。非常感谢!大多数情况下使用同步是个坏主意。是的,这是真的,使用async到false会停止浏览器,直到响应出现。将其解析为回调非常有效,并允许我保持调用异步。感谢您帮助我更好地理解如何使用这些工具!