2016-05-21 132 views
1

我是新來的nodejs回調函數。我必須在給定的兩個價格範圍之間找到電話列表,如果在獲得的列表中沒有15個電話,我必須改變價格範圍,直到我有15個電話。其實我寫了從另一個文件中的數據庫搜索手機的功能,從該文件我發送回調函數調用。在得到回調之後,如果數組大小小於15,則必須檢查數組大小,然後更改價格範圍,並且必須調用與遞歸或循環相同的函數。我無法處理回調函數。請幫我寫出正確的代碼。Nodejs循環回調函數

while(true){ 
      console.log("around came") 
      Search.findBestMobile(context.end_price , context.start_price , function(data){ 
       console.log("Best Mobile"); 
       size = data.hits.hits.length; 
       if(size >= 15){ 
        context.phone_list = makeStringFromArray(data.hits.hits); 
        cb(context); 
        break; 
       }else{ 
        context.start_price += 1000; 
        context.end_price += 1000; 
       } 
      }); 
     } 

但是在上面的代碼中,break是不可達的語句。我無法處理它。請幫幫我。

+2

'while(true)' - 這不是一個好主意。 – dfsq

+0

是的,我知道,如何修改 –

+0

你已經在使用回調(只在其他分支中添加一個),所以不知道有什麼問題。 – dfsq

回答

3

問題是,您正嘗試以同步方式使用異步代碼。這根本不會這樣做,因爲回調可以在幾秒後調用。如果調用內部函數,旁邊的中斷將不起作用。 你真的在做什麼就是調用Search.findBestMobile無限次。 Node.js只有一個線程用於運行你的代碼,並且你正在阻止它。所以回調不會被調用。

你需要做的是使用遞歸或其他異步方法來循環。 這樣做的一個簡單方法是再次用新的上下文調用你的外部函數。

function searchRange(context, cb) { 
    Search.findBestMobile(context.end_price , context.start_price , function(data){ 
       console.log("Best Mobile"); 
       size = data.hits.hits.length; 
       if(size >= 15){ 
        context.phone_list = makeStringFromArray(data.hits.hits); 
        cb(context); 
       }else{ 
        context.start_price += 1000; 
        context.end_price += 1000; 
        searchRange(context, cb); 
       } 
      }); 
} 
+1

請記住,node.js **不是**單線程,實際發生的情況是單個線程運行您的代碼並將I/O綁定的工作委託給線程池,如以下所述:http:// www。 haneycodes.net/to-node-js-or-not-to-node-js/ – GGG

+0

是的,但是你的代碼只能在單線程中運行。據我所知,至少。所以是的,我寫錯了node.js是單線程的。但阻止while(true)的問題仍然成立。 – sielakos

+0

是的,你的回答是完全正確的,我相信你能夠查明錯誤,我只是想解決一個錯誤的概念,一些node.js開發人員有node.js是單線程(完全) – GGG