2011-12-02 125 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'的函數也是可見的。 –