Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jquery和ajax的javascript范围问题_Javascript_Jquery_Ajax_Variables_Scope - Fatal编程技术网

jquery和ajax的javascript范围问题

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

我有一个函数,可以对bartapi进行jqueryajax调用,以获得接下来的一系列列车。该函数应返回下一列车发车的字符串:

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会停止浏览器,直到响应出现。将其解析为回调非常有效,并允许我保持调用异步。感谢您帮助我更好地理解如何使用这些工具!