2016-09-26 84 views
1

所以我想獲得一個循環數組和nodejs的異步性質正在殺死我。這裏是我的代碼:我不能停止異步

\t getDevices(userIDs, function(result) { 
 
\t \t if (result) { 
 
\t \t \t sendNotification(messageUser, messageText, result); 
 
\t \t \t res.send("Success"); 
 
\t \t } else { 
 
\t \t \t res.send("ERROR"); 
 
\t \t } 
 
\t }); 
 
\t 
 
}); 
 

 
function getDevices(userIDs, callback) { 
 
\t var userDevices = []; 
 
\t var device = []; 
 
\t 
 
\t for (var i = 0; i < userIDs.length; i++) { 
 
\t \t \t searchRegisterDevices(userIDs[i], function(result) { 
 
\t \t \t \t if (result) { 
 
\t \t \t \t \t for (var j = 0; j < result.length; j++) { 
 
\t \t \t \t \t \t device = {platform: result[j].platform, token: result[j].token}; 
 
\t \t \t \t \t \t userDevices.push(device); \t \t 
 
\t \t \t \t \t } 
 
\t \t \t \t } else { 
 
\t \t \t \t \t console.log("ERROR"); 
 
\t \t \t \t } 
 
\t \t \t }); \t 
 
\t } 
 
\t callback(userDevices); 
 
}

function searchRegisterDevices(userID, callback) { 
 
\t MongoClient.connect(url, function(err, db) { 
 
\t \t if (err) { 
 
\t \t \t console.log(err); 
 
\t \t } else { 
 
\t \t \t console.log("We are connected"); 
 
\t \t } 
 
\t \t 
 
\t \t var collection = db.collection('RegisteredDevices'); 
 
\t \t collection.find({userID: userID}).toArray(function (err, result) { 
 
\t \t \t if (err) { 
 
      \t console.log("Error: " + err); 
 
     \t } else if (result.length) { 
 
\t \t \t \t callback(result); 
 
     \t \t } else { 
 
      \t console.log('No document found'); 
 
     \t } 
 
     \t db.close(); 
 
    \t }); 
 
\t });

我首先需要讓我的所有設備從我的MongoDB集合匹配的用戶ID的ID。 SO userIDs是與該集合中的設備綁定的一組ID。一旦我得到設備,我需要從返回的對象中獲取設備標記。

因此: 1)調用getDevices傳遞用戶ID數組 2)調用searchRegisterDevices與設備ID。 3)searchRegisterDevices返回設備數組。 4)從該數組中獲取設備標記並推送到userDevices數組。 5)回userDevices陣列 6)調用sendNotification時與userDevices

我知道我的問題的陣列,我只是我有一個很難解決這些問題

回答

1

而不是讓用戶設備,你應該讓他們每個用戶使用單個查詢: 第一:它會減少呼叫次數 第二:它會幫你處理回調o/p。

它使用$ in操作符。

更改searchdevices方法:

function searchRegisterDevices(userID, callback) { 
    MongoClient.connect(url, function(err, db) { 
      if (err) { 
       console.log(err); 
      } else { 
       console.log("We are connected"); 
      } 

      var collection = db.collection('RegisteredDevices'); 
      collection.find({ 
        userID: { 
         $in: userIDs 
        }).toArray(function(err, result) { 
        if (err) { 
         console.log("Error: " + err); 
        } else if (result.length) { 
         callback(result); 
        } else { 
         console.log('No document found'); 
        } 
        db.close(); 
       }); 
      }); 
    } 

它將返回userdevices的數組通過用戶ID。

+0

起初我會抱怨說這不起作用。然後它打我。這工作完美。我不敢相信我沒有想到這一點。不是搜索每個設備,而是返回每個ID的每個設備的數組。完善。給予好評! –

+0

@AustinHunter我很高興它爲你提供幫助。 :) – Sachin