2011-12-02 120 views
0

我的代码有一些“奇怪”的问题。这主要是西班牙语,但我相信你会得到。为什么变量超出范围?

$('#favoritos').live('pagecreate',function(event){ 
    var favoritos = false; 
    var fav_bus = ''; 
    var fav_bici = ''; 
    if (!isLocalStorageAvailable()) // Si no hay Local Storage para qué queremos entrar aqui 
     $.mobile.changePage('#errorFavoritos', { transition: "pop" }); 
    else{ 
     $.each(localStorage, function(index){ 
      var itemKey = localStorage.key(index); 
      if (itemKey.indexOf('fav')){ // Si es un favorito 
       var splitted = itemKey.split('-'); 
       var tipo = splitted[0]; 
       var numero = splitted[2]; 
       favs_locales[itemKey] = { 
        'numero' : numero, 
        'id' : itemKey 
       }; 
       if (tipo == 'bus'){ 
        favoritos = true; 
        fav_bus = '<div data-role="collapsible>' + 
           '<h3>Parada ' + numero+ '</h3>' + 
            '<ul data-role="listview" data-inset="true" id="'+itemKey+'">'; 
        pedirTiempos(numero).pipe(formatearTiempos).done(function(html){ 
         fav_bus += html + '</ul></div>'; 
        }); 
       } 
      } 
     }); 
     // Ya tenemos los datos formateados 
     console.log(fav_bus); 
     if (fav_bus != ''){ 
      $('#contentFavoritos').append(
           '<h3 style="text-align: center;">Paradas de Bus</h3>' + 
            '<div data-role="collapsible-set">' + 
             fav_bus + 
            '</div>'); 
     } 
    } 
}); 

问题来自于这样的功能:

pedirTiempos(numero).pipe(formatearTiempos).done(function (html) { 
    fav_bus += html; 
}); 

的变化(功能)后fav_bus也没关系,但只是功能后console.log(fav_bus),它是错误的。这就像它在功能中没有改变。

我试过返回html,但它输出的是[Object, object](作为字符串)。

任何提示?

编辑:

我试图将其存储到一个时间的DOM元素和它的好,但我不能够输出HTML(虽然它的存在)。

pedirTiempos(numero).pipe(formatearTiempos).done(function(html){ 
     fav_bus += html + '</ul></div>'; 
     $('#busTemp').html(fav_bus); 
}); 

if ($('#busTemp').length > 0){ 
    console.log($('#busTemp').html()); 

输出什么都没有!

回答

1

从我的代码中可以看出,done看起来像一个异步调用。所以你传递给它的函数最有可能在fav_bus += '</ul></div>之后运行。这就是为什么你没有看到变化。

如果你把一个console.log传递给done函数内,另一只console.log调用done后,你可能会看到外面console.log跑第一。

要解决此问题,需要在您传递给done的匿名函数内完成对fav_bus的任何后续操作。

此外,你不能真正返回任何异步函数。这就是为什么你需要一个回调,它将在异步结果上运行。

编辑

代码更改为for..in真的不应该破坏任何东西,除非你明确地使用循环索引的东西。你应该能够得到它的工作是,与以下变化:

if (tipo == 'bus') { 
    favoritos = true; 
    fav_bus = '<div data-role="collapsible>' + '<h3>Parada ' + numero + '</h3>' + '<ul data-role="listview" data-inset="true" id="' + itemKey + '">'; 
    pedirTiempos(numero).pipe(formatearTiempos).done(function (html) { 
     fav_bus += html + '</ul></div>'; 

     // Ya tenemos los datos formateados 
     if (fav_bus != '') { 
      $('#contentFavoritos').append('<h3 style="text-align: center;">Paradas de Bus</h3>' + '<div data-role="collapsible-set">' + fav_bus + '</div>'); 
     } 
    }); 
} 
+0

我已经改变了我的代码封装成一个各一个,而不是为它打破了异步部分,并试图安慰。日志和它的工作,但仍然没有运气在这里。我必须执行一些不同类型的操作,然后根据我得到的结果输出不同的东西...更新代码btw –

+0

当我循环访问localStorage时,索引真的很需要。我需要收集信息,然后,如果我有他们,展示他们,如果没有,展示另一件事。 –

+0

然后,你应该能够保持代码原样(即,不要把它改成'for ... in')。 –

0

fav_bus变量是本地.live功能和.done不可见。

移动代码进行的匿名函数,这将是一样的:

function foo() { 
    var a = 5; 
    bar(); 
} 

function bar() { // "a" is out of scope here. 
    a += 5; 
} 
+0

你提供的例子是不相同的,这不是这里发生的事情。问题是他试图使用一个未正确初始化的变量,因为它在异步函数中运行。作为参数传递给'done'的匿名函数与传递给'live'的匿名函数处于相同的范围。由于'fav_bus'是在后者中定义的,所以对于传递给'done'的函数也是可见的。 –