2013-05-08 52 views
0

更新:解決了,這確實是一個範圍問題。我通過移動數據庫類中的用戶列表代碼並返回預建列表來解決這個問題。在node.js中執行異步調用時變量爲空(閉包)

使用node.js,我做了一個異步調用函數findUser,並從回調中構建一個用戶列表到變量內容中。在循環(它表示內容變量可用)期間這工作正常,但是當循環退出時,變量是空的。我該如何重寫代碼,以便在循環外部提供變量內容的值?

exports.listUsers=function(req,res) { 
    var content='' 
    isLoggedIn=user.findUser({},function(myuser) { 
     content = content +'<li>' + myuser.firstname + ' ' + myuser.lastname + "</li>\n"; 
      //here value of content var is available 
      console.log(content) 
    }) 
     //here value of content var is empty 
    console.log(content) 
    showPage(req,res,{'content':content}) 
} 
+0

這可能是一個範圍界定問題嗎?你可能會鏈接到一個現場版本,或嘗試構建一個jsfiddle?我給它一個鏡頭,但沒有發現任何有用的東西 – maaachine 2013-05-08 18:14:11

+1

當然,它是空的,回調被執行**異步**。你不是說過嗎?或者你不明白這是什麼意思? – Bergi 2013-05-08 18:23:18

回答

2

如果findUser()是異步的(你表示),那麼問題是,當findUser()是​​叫尚未完成。

對於異步函數,您只能使用成功處理函數的結果。您不能調用異步函數,並期望像您當前的代碼那樣同步使用它。

我不知道到底你想實現什麼,但是這是你需要使用的通用設計模式:

exports.listUsers=function(req,res) { 
    isLoggedIn=user.findUser({},function(myuser) { 
     var content = '<li>' + myuser.firstname + ' ' + myuser.lastname + "</li>\n"; 
     //here value of content var is available 
     console.log(content) 
     showPage(req,res,{'content':content}) 
    }); 
} 

或者,如果回調被調用多次一次每個用戶,您可以累積內容並在最後一次回撥中致電​​:

exports.listUsers=function(req,res) { 
    var content = ""; 
    isLoggedIn=user.findUser({},function(myuser) { 
     content += '<li>' + myuser.firstname + ' ' + myuser.lastname + "</li>\n"; 
     //here value of content var is available 
     console.log(content) 
     // devise some logic to know when the last callback is being called 
     // perhaps based on a user count 
     if (this is the last user callback) { 
      showPage(req,res,{'content':content}) 
     } 
    }); 
} 
+0

它不適用於我的情況,因爲每個用戶都會調用一次匿名函數:showPage函數會被每次循環返回一個用戶多次調用。而不是回調,我簡化了事情,只返回預製列表 - 謝謝 – 2013-05-08 18:48:31

+0

@YounElan - 那麼你需要積累像你這樣做的內容,但知道什麼時候回調被稱爲最後一次,並調用' showPage()'然後。我在我的答案中加入了一個例子。 – jfriend00 2013-05-08 18:54:35