2016-08-13 4 views
0
function(dataValue, cb) { 
      req.app.db.models.User.find({ 
       _id: { $ne: dataValue._id } 
      }, function(err, totalUser) { 
       if (!err) { 
        var len = totalUser.length; 
        if (len !== 0) { 
         req.app.utility.async.map(totalUser, function(each, callback) { 
          console.log(each); 
          req.app.utility.async.mapSeries(each.nonregisterContact, function(element, callback1) { 
           console.log('element', element.number); 
           console.log('dataValue', dataValue.mobileNumber); 
           console.log('kolka', Number(element.number) === Number(dataValue.mobileNumber)); 
           if (Number(element.number) === Number(dataValue.mobileNumber)) { 
            each.registerContact.push(dataValue._id.toString()); 
            each.nonregisterContact.splice(element, 1); 
            each.save(function(err, finalResult) { 
             if (!err) { 

             } else { 
              console.log(err); 
             } 
            }) 
            callback1(null, null); 
           } else { 
            callback1(null, null); 
           } 
          }, function(err, final) { 
           if (!err) { 
            callback(null, null); 
           } else { 
            console.log(err); 
           } 

          }); 

         }, function(err, result) { 
          if (!err) { 
           console.log('2'); 
           return cb(null, dataValue); 
          } else { 
           console.log(err); 
          } 

         }); 
        } else { 
         return cb(null, dataValue); 
        } 
       } else { 
        cb(err); 
       } 
      }) 
     } 

Ich nenne bekommen keine Antwort nach each.save Methodenaufruf in der mapSeries Methode final callback.I dieses solution.How versuche ich das Gleiche tun wird. Wie kann ich das lösen und mit dieser Situation umgehen?Knoten js Abfrage Async Map-Funktion ist

Antwort

0

Ich habe versucht, den Code zu vereinfachen, aber ich bin mir nicht sicher, ob mein Code Ihre Bedürfnisse erfüllt. Ich kann es auch nicht testen: D
, each, element, finalResult sind sehr gebräuchliche Namen, also sollten Sie sie mit Vorsicht verwenden, um Code lesbar/unterstützbar zu halten.

// very bad idea is include other libraries to app 
var async = require('async'); 
var db = require('db'); // this module must export connection to db 
... 
function (dataValue, cb) { 
    // processUser use data from closure of current function => inside of current 
    function processUser (user, callback) { 
     async.mapSeries(user.nonregisterContact, function(contact, callback){ 
      // Check and exit if condition is not satisfied. It's more readable. 
      if (Number(contact.number) !== Number(dataValue.mobileNumber)) 
       return callback(null); // ignore user 

      user.registerContact.push(dataValue._id.toString()); 
      user.nonregisterContact.splice(contact, 1); 
      user.save(function(err, finalResult) { // Is finalResult ignore? 
       if (err) 
        console.log(err); 
       callback(); // ingnore error 
      }) 
    }, callback); 

    db.models.User.find({_id: { $ne: dataValue._id }}, function(err, userList) { 
     if (!err) 
      return cb(err); 

     if (userList.length == 0) 
      return cb(new Error('Users not found')); 

     // use named function to avoid stairs of {} 
     async.map(userList, processUser, cb); 
    }) 
};