2012-08-16 88 views
2

爲未定義我有下面的代碼有問題:對象屬性顯示的console.log

var data = {}; 

$('table tr').each(function() { 
    var uid = $('td a', $(this)).attr('href').split('=')[1]; 

    TTDB.transaction(
    function (tx) { 
     tx.executeSql("SELECT id FROM players WHERE uid = ?;", [uid], function (txSub, results) { 
      data[uid] = results.rows.item(0).id; 
     }, TTDBerrorHandler); 
    } 
); 
}); 

$('#member tbody tr').each(function() { 
    var uid = $('td a', $(this)).attr('href').split('=')[1]; 

    console.log(uid); // Returns correctly 1643 as shown below 
    console.log(data); // Returns whole object correctly 
    console.log(data['1643']); // Returns **undefined** 
    console.log(data[uid]); // Returns **undefined** 
    console.log(uid); // uid is still correctly set to 1643 

    /* Following from Safari console 
    1643 
    Object 
    156: 1 
    217: 17 
    295: 138 
    579: 136 
    764: 139 
    774: 142 
    816: 144 
    826: 14 
    955: 73 
    1096: 137 
    1133: 13 
    1134: 141 
    1232: 140 
    1321: 11 
    1643: 31 
    2307: 143 
    __proto__: Object 
    undefined 
    undefined 
    1643 
    */ 
}); 

下面是測試組的工作,因爲它應該。

var test = {}; 
test[156] = 1; 
test[1643] = 31; 

var testUid = 1643; 

console.log(test); 
console.log(test['1643']); // Returns correctly 31 as shown below 
console.log(test[testUid]); // Returns correctly 31 as shown below 

/* This is from Safari console 
Object 
    156: 1 
    1643: 31 
    __proto__: Object 
31 
31 
*/ 

由於基本相同的測試集的作品,我想這個問題有事情做與本地數據庫的異步操作,但我只是無法弄清楚如何解決這一問題?

更新: 澄清我的問題/我想要實現的。

例如,如果我有一個表,我反覆,然後想添加一些字段與數據庫中的數據。

<table> 
    <tr><td class="uid">123<td></tr> 
    <tr><td class="uid">234<td></tr> 
</table> 

然後我會想新列添加到它:

$('table tr').each(function() { 
    var uid = $('td.uid', $(this)).text(); 

    TTDB.transaction(
    function (tx) { 
     tx.executeSql("SELECT id FROM players WHERE uid = ?;", [uid], function (txSub, results) { 
      // Problem is that because this transaction is asynchronous $(this) is 
      // not defined when this gets executed. 
      $(this).append('<td class="id">' + id + '</td>'); 
     }, TTDBerrorHandler); 
    } 
); 
}); 
+0

對象鍵不應以數字開頭。 – 2012-08-16 20:54:33

+0

@LoïsDiQual:爲什麼? – 2012-08-16 20:59:52

+0

你有沒有試過'uid.trim()?'遠射,但你永遠不會知道...... – 2012-08-16 21:03:04

回答

0

把代碼的調用由該回調

$('#member tbody tr').each(function() {...

executeSql()功能的回調中並根本擺脫第二$.each()

因此,對於每個獲取的數據行,您將更新相應的HTML表格行。

更新:代碼示例。

$('table tr').each(function() { 
    var uid = $('td a', $(this)).attr('href').split('=')[1], 
    tr$ = $(this); 
    TTDB.transaction(
    function (tx) { 
     tx.executeSql("SELECT id FROM players WHERE uid = ?;", [uid], function (txSub, results) { 
      // access tr$ here... 
      // $('td', tr$).each(function() { var td$ = $(this); /* ... */ }); 
      data[uid] = results.rows.item(0).id; 
     }, TTDBerrorHandler); 
    } 
); 
}); 
+0

這是行不通的,因爲事務是異步的 - > $(this)在執行查詢時沒有定義......我最初創建了第二個.each()來解決這個問題,但仍然沒有獎勵。 – Damiqib 2012-08-16 22:23:35

+0

剛剛更新了我的答案,以表明我的意思。 – 2012-08-16 22:35:52

+0

如果我這樣做: tr $ = $(this); TTDB。交易( function(tx){ \t \t tx.executeSql(「SELECT id,att,def FROM players WHERE uid =?;」,[uid],function(txSub,results)){console.log(tr $) ; \t \t},TTDBerrorHandler); \t} ); 有適量的日誌事件,但它們都具有表格中最後一個tr的內容 – Damiqib 2012-08-16 22:55:18

1

如果你改變你的日誌使用JSON.stringify你將看到物體是空的。

console.log(uid); 
console.log(JSON.stringify(data)); // Returns empty object 

使用JSON.stringify強制控制檯在控制檯中展開對象時立即讀取整個對象,而不是稍後。

您應該在tx.executeSql回調中記錄日誌代碼,以便在響應結束後記錄單個項目。

+0

您是對的:使用JSON.stringify對象爲空。你能澄清你最後一句話嗎? – Damiqib 2012-08-16 22:35:59

+0

@Damiqib:對象爲空的原因是'executeSql'是一個「異步」請求。這意味着它在運行後不會阻塞任何代碼。任何在響應上運行的代碼都需要在回調中。基本上,代碼流繼續在回調中,而不是直接在'tx.executeSql'調用之後。 – 2012-08-16 23:09:43

相關問題