2014-12-17 19 views
10

Xin chào Tôi đang cố gắng sử dụng mô-đun Async để truy xuất hai người dùng và thực hiện một số xử lý sau khi cả hai đã được truy xuất nhưng tôi vẫn nhận được thông báo lỗi: Gọi lại đã được gọi. Dưới đây là đoạn code tôi hiện đang có:Gọi lại đã được gọi là không đồng bộ song song

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

     } 
    ); 
}); 

Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

16

Thêm khác tuyên bố mã của bạn, bởi vì nếu bạn nhận được lỗi, callback của bạn thực hiện hai lần

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

phải đối mặt với cùng một vấn đề tốt bắt nhờ: @Alexander –

5

The docs from async actually say:

Hãy chắc chắn để luôn trở lại khi gọi một callback đầu, nếu không bạn sẽ gây ra nhiều cuộc gọi lại và hành vi không thể đoán trước trong nhiều trường hợp .

Vì vậy, bạn có thể làm:

return callback(err); 
+1

không giúp đỡ. –

Các vấn đề liên quan