2014-12-17 14 views
10

हाय कहा गया है, मैं दो उपयोगकर्ताओं को पुनर्प्राप्त करने के लिए Async मॉड्यूल का उपयोग करने की कोशिश कर रहा हूं और दोनों को पुनर्प्राप्त करने के बाद कुछ प्रसंस्करण कर रहा हूं, हालांकि मुझे त्रुटि संदेश मिल रहा है: कॉलबैक पहले से ही कॉल किया गया था। नीचे कोड है जो वर्तमान में है:कॉलबैक को पहले से ही एसिंक समांतर

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

     } 
    ); 
}); 

किसी भी मदद की सराहना की जाएगी।

उत्तर

16

अपने कोड के लिए और बयान जोड़े, यदि आप त्रुटि मिलती है, अपने कॉलबैक दो बार निष्पादित करता है क्योंकि

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

एक ही मुद्दा अच्छा कैच धन्यवाद का सामना करना पड़: –

5

The docs from async actually say:

हमेशा वापस जाने के लिए जब एक कॉलबैक जल्दी बुला सुनिश्चित करें, अन्यथा आप कई मामलों में एकाधिक कॉलबैक और अप्रत्याशित व्यवहार का कारण बनेंगे।

तो तुम कर सकते हैं:

return callback(err); 
+1

@Alexander मदद की नहीं किया। –

संबंधित मुद्दे