2014-12-17 13 views
10

Ciao Sto cercando di utilizzare il modulo Async per recuperare due utenti e fare un po 'di elaborazione dopo che sono stati recuperati, tuttavia continuo a ricevere il messaggio di errore: la richiamata era già stata chiamata. Di seguito è il codice che attualmente ho:Il callback era già chiamato parallelo asincrono

app.get('/api/addfriend/:id/:email', function(req, res) { 
    var id = req.params.id; 
    var friendEmail = req.params.email; 
    async.parallel([ 
      //get account 
      function(callback) { 
       accountsDB.find({ 
        '_id': ObjectId(id) 
       }, function(err, account) { 
        console.log(id); 
        if (err || account.length === 0) { 
         callback(err); 
        } 
        console.log(account[0]); 
        callback(null, account[0]); 
       }); 
      }, 
      //get friend 
      function(callback) { 
       accountsDB.find({ 
        'email': friendEmail 
       }, function(err, friend) { 
        console.log(friendEmail); 
        if (err || friend.length === 0 || friend[0].resId === undefined) { 
         callback(err); 
        } 
        console.log(friend[0]); 
        callback(null, friend[0].resId); 
       }); 
      } 
     ], 

     //Compute all results 
     function(err, results) { 
      if (err) { 
       console.log(err); 
       return res.send(400); 
      } 

      if (results === null || results[0] === null || results[1] === null) { 
       return res.send(400); 
      } 

      //results contains [sheets, Friends, Expenses] 
      var account = results[0]; 
      var friend = results[1]; 
      if (account.friends_list !== undefined) { 
       account.friends_list = account.friends_list + ',' + friend; 
      } 
      else { 
       account.friends_list = friend; 
      } 
      // sheetData.friends = results[1]; 
      accountsDB.save(
       account, 
       function(err, saved) { 
        if (err || !saved) { 
         console.log("Record not saved"); 
        } 
        else { 
         console.log("Record saved"); 
         return res.send(200, "friend added"); 
        } 
       } 
      ); 

     } 
    ); 
}); 

Qualsiasi aiuto sarebbe apprezzato.

risposta

16

Aggiungere altro dichiarazione al codice, perché se si ottiene l'errore, il callback esegue due volte

if (err || account.length === 0) { 
    callback(err); 
} else { 
    callback(null, account[0]); 
} 
+1

fronte stesso problema buona pesca grazie: @Alexander –

5

The docs from async actually say:

Assicurarsi di tornare sempre quando si chiama un callback presto, altrimenti causerà più callback e comportamenti imprevedibili in molti casi .

modo da poter fare:

return callback(err); 
+1

non ha aiutato. –

Problemi correlati