2014-12-17 12 views
10

Hallo genannt Ich versuche, das Async-Modul zu verwenden zwei Benutzer abzurufen und einige Verarbeitung zu tun, nachdem sie beide haben jedoch abgefragte ich immer die Fehlermeldung bekommen: Rückruf wurde bereits genannt. Unten ist der Code, den ich zurzeit habe:Rückruf wurde bereits async parallel

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"); 
        } 
       } 
      ); 

     } 
    ); 
}); 

Jede Hilfe würde geschätzt werden.

Antwort

16

hinzufügen sonst Anweisung, um Ihren Code, denn wenn Sie Fehler erhalten, die Rückruf zweimal führt

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

gleiche Problem guten Fang Dank gegenüber: @Alexander –

5

The docs from async actually say:

Vergewissern Sie sich immer zurück, wenn früh einen Rückruf anrufen, sonst Sie werden mehrere Rückrufe und unvorhersehbares Verhalten in vielen Fällen verursachen.

So können Sie tun:

return callback(err); 
+1

nicht geholfen hat. –

Verwandte Themen