2010-11-04 158 views
0

我有以下一段JavaScript,但對於某些範圍的原因,從myfunc返回的「名稱」爲空。JavaScript範圍問題

var myfunc = function(client, id) { 
    var names = new Array(); 
    client.query(
    'SELECT stuff FROM mytable WHERE id="'+id+'"', 
    (function selectCb(err, results, fields) { 
     if (err) { 
     throw err; 
     } 
     for (result in results) { 
     // This prints fine 
     console.log(results[result].name); 
     names[result] = results[result].name; 
     } 
     client.end(); 
    }) 
); 
    // The following returns empty 
    return names; 
} 

console.log(myfunc(1,2)); 

如何讓它突破範圍?

回答

1

它是空的,因爲您的「查詢」功能的調用是異步。直到結果可用,您傳遞給它的函數將不會運行。因此,在調用回調函數之前,您的「myfunc」函數立即返回。

在瀏覽器中使用Javascript,您必須認真對待這些條款。相反,期待您的「姓名」,立即準備的,改變「MYFUNC」,讓你通過一個回調函數被調用時的名稱是實際可用:

var myfunc = function(client, id, whenFinished) { 
    var names = new Array(); 
    client.query(
    'SELECT stuff FROM mytable WHERE id="'+id+'"', 
    (function selectCb(err, results, fields) { 
     if (err) { 
     throw err; 
     } 
     for (result in results) { 
     // This prints fine 
     console.log(results[result].name); 
     names[result] = results[result].name; 
     } 
     client.end(); 
     if (whenFinished) whenFinished(names); // callback 
    }) 
); 
}; 

現在,當你打電話給你的功能,而不是期待「名稱」作爲返回值,你會在通過另一功能將充當名稱的列表:

myfunc(1, 2, function(names) { console.log(names); }); 
+0

我怎麼能這樣做? – 2010-11-04 21:15:53

+0

我會添加到我的答案。 – Pointy 2010-11-04 21:44:29

0
var names = new Array(); 

var myfunc = function(client, id) { 

    client.query(
    'SELECT stuff FROM mytable WHERE id="'+id+'"',function selectCb(err, results, fields) 
    { 
     if (err) { 
     throw err; 
     } 
     for (result in results) { 
     // This prints fine 
     console.log(results[result].name); 
     names[result] = results[result].name; 
     } 
     client.end(); 
    } 
); 
    // The following returns empty 
    return names; 
} 

console.log(myfunc(1,2)); 

嘗試使名稱的全局

+1

這不會幫助,我不認爲。 *最終*「名字」數組將被填充,但不是立即。 – Pointy 2010-11-04 18:18:55

1

如果client.query(...)是異步的,那麼selectCb功能不會運行,不會因時間已改變, myfunc返回。您需要重新設計myfunc以異步返回名稱(例如,通過接受它在selectCb末尾調用的函數參數)。

+0

您能否給我一個具體的例子或者指點我一些參考?謝謝! – 2010-11-04 21:16:23