2016-09-26 7 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 в UserIds. SO userID - это массив идентификаторов, привязанных к устройствам в коллекции. Как только я получу устройство, мне нужно получить токен устройства из возвращаемого объекта.

So: 1) вызов getDevices, передающий массив идентификаторов пользователя 2) вызов searchRegisterDevices с идентификатором устройства. 3) searchRegisterDevices возвращает массив устройств. 4) получить маркер устройства из этого массива и нажать массив userDevices. 5) возвращение userDevices массива 6) называют sendNotification с массивом userDevices

Я знаю, что мои вопросы, я просто я с трудом решая их

ответ

1

Вместо того, чтобы устройство пользователя для каждого пользователя, вы должны получить их используя один запрос: Во-первых: он уменьшит количество звонков Второй: он позволит вам обрабатывать обратные вызовы o/p.

Для этого используется оператор $ в операторе.

Изменить метод 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 для прошедших идентификаторов пользователей.

+0

Сначала я собирался жаловаться, сказав, что это не сработает. Тогда это ударило меня. ЭТО РАБОТЫ СОВЕРШЕННЫ. Не могу поверить, что я об этом не думал. Вместо поиска для каждого устройства это возвращает массив каждого устройства каждого идентификатора. Отлично. Upvote! –

+0

@AustinHunter Я рад, что это вам помогло. :) – Sachin

Смежные вопросы