2016-01-25 82 views
0

在redis中使用hexists檢查執行for循環,但我只獲得數組中最後一項的響應。我嘗試了所有的方法,包括異步和一些建議在堆棧溢出,但無法獲得解決方案,不知道我錯過了什麼。for nodejs中的循環不能與redis hexists一起使用

代碼如下

reply.forEach(function(replyitem,index){ 
      parsedReply = JSON.parse(replyitem); 

       if(checkMsg(parsedReply.msguuid, index) == null){ 
        result.push(parsedReply); 
       } 
      count++; 
     if ((count + 1) == reply.length){ 
     // Pass the info list to the view 
       cd("# of info shown when page is loaded: - " + result.length); 
       sendAllLocations(whorequested + ":mylocation", res, result); 
      } 
     }); 



function checkMsg(msgidVal, index){ 
       redisClient.hexists(blockedlistname, msgidVal, function (rediserr, exists) { 
       if (rediserr) { 
        ce("Error " + JSON.stringify(rediserr)); 
       } else if (!exists) { 
        return false; 
       } else { 
        return true; 
        cd(" not displaying " + msgidVal); 
       } 
      }); 

} 

回答

0

checkMsg()功能正在爲Redis的數據庫中的異步調用,但隨後試圖從checkMsg()函數返回值。它不會那樣工作。異步值不能直接從函數返回。該函數返回之前異步值甚至已被檢索。並且,從異步回調中返回值,只需返回到數據庫基礎結構中,而不是返回到任何代碼(例如,它沒有任何用處)。

您將不得不以異步方式使用checkMsg進行編程。它需要一個回調或承諾它可以返回結果,然後所有使用checkMsg的代碼都必須使用該回調來檢查結果。您將不得不異步使用該函數,就像您在代碼中的其他地方進行異步操作一樣。