Async.waterfall: обратный вызов уже был вызван на node.js

Я полностью осознаю, что здесь есть вопросы, которые пытаются решить проблему, которую я здесь поднимаю.

Я прошел через все из них, пытаясь реализовать ответы, которые даны в этих темах, но безуспешно. Ошибка, которую я получаю, когда пытаюсь реализовать async.waterfall(), заключается в том, что обратный вызов уже был вызван.

Я надеюсь получить некоторые указатели, откуда я мог заставить это работать. Спасибо.

getTodayDetail: function(cId,endTime,user,callback){
        console.log('Lets begin here');
        console.log('clinic id :'+cId);
        console.log('endtime for appoinment '+endTime);
        var ett = new Date();
        ett.setSeconds(0);
        ett.setHours(0);
        ett.setMinutes(0);
        var cid = cId;
        console.log(mongoose.Types.ObjectId.isValid(cid));
        //var clinicId = mongoose.Types.ObjectId(clinicId);
        //ett.setHours(00,00,1).toISOString();
        console.log("Value of et variable after setHours function "+ett);
       // var et = moment(endTime).utcOffset("+00:00").format('ddd MMM DD YYYY');
        async.waterfall([
            function f1 (callback){
                console.log('f1 from getTodayDetails '+cid);
                console.log("endTime "+endTime);
                appointment.find({ 
                    clinicId: cid, 
                    endTime: { $gte: ett, $lte: endTime }}, function(err, appointmentdetails){
                    if(err)
                    {
                        callback(err,null);
                        console.log(err);
                        return;
                    }else
                    {
                        callback(null, appointmentdetails);
                        console.log("Success "+appointmentdetails);
                    }
                })
            },
            function f2(appointmentdetails, callback) {
                console.log("from f2 content of appointmentdetails :"+appointmentdetails.data);
                for (var i = 0; i<appointmentdetails.length; i++)
                {
                    console.log("Success f2");
                    Temppay.find(({appointmentId: appointmentdetails[i]._id}),function(err, result2){
                        if(err)
                        {
                            callback(err, null);
                            console.log(err);
                            return;
                        }else{
                            callback(null, result2, appointmentdetails);
                            console.log("from f2 content of result2 "+result2.data);
                        }
                    })
                }
            },
            function f3(result2, appointmentdetails, callback){
                for(var i = 0; i<result2.length; i++)
                {
                    console.log("f3 Success");
                    patient.find(({"_id": result2[i].patientId}), function(err, result3){
                        if(err)
                        {
                            callback(err, null);
                            console.log(err);
                            return;
                        }
                        else 
                        {
                            callback(null, result3,result2,appointmentdetails);
                        }
                    })
                }

            }
        ], function(err, result3, result2,appointmentdetails){
            if(err)
            {
                console.error(err);
                return;
            }else
            {
                var appoinmentoftoday = appointmentdetails;
                var paymentdetails = result2;
                var patientdetails = result3;
                console.log("Today's appointments"+JSON.parse(JSON.stringify(appoinmentoftoday)));
                console.log("Today's appointment payment details"+JSON.parse(JSON.stringify(result2)));
                console.log("Today's appointments patient details "+JSON.parse(JSON.stringify(result3)));

            }
        })
},

Это из терминала, что я получаю как ошибку

from f2 content of result2 undefined

    0|app      | Error: Callback was already called.
    0|app      |     at /home/test_user/Server/node_modules/async/dist/async.js:955:32
    0|app      |     at /home/test_user/Server/app/service/appointmentService.js:1661:29
    0|app      |     at model.Query.<anonymous> (/home/test_user/Server/node_modules/mongoose/lib/model.js:3764:16)
    0|app      |     at /home/test_user/Server/node_modules/kareem/index.js:277:21
    0|app      |     at /home/test_user/Server/node_modules/kareem/index.js:131:16
    0|app      |     at _combinedTickCallback (internal/process/next_tick.js:131:7)
    0|app      |     at process._tickDomainCallback (internal/process/next_tick.js:218:9)

person mighty    schedule 22.05.2019    source источник


Ответы (1)


Вы вызываете метод обратного вызова несколько раз, запуская его внутри цикла.

Обратный вызов должен быть вызван только один раз.

Вместо этого вы можете поместить результаты цикла в массив и вызвать метод обратного вызова с массивом.

Обновлять:-

function f2(appointmentdetails, callback) {
    Promise.all(appointmentdetails.map((appointment) => {
        return Temppay.find({appointmentId: appointment._id});
    })).then((results) => {
        callback(null, results, appointmentdetails);
    });
}

Почему бы вам не заменить свой метод, как указано выше?

person Shareef    schedule 22.05.2019
comment
вы имеете в виду что-то вроде этого назначениеdetails.foreach(Res) {appointmentdetails.data.push(res)}? - person mighty; 22.05.2019
comment
Да, ты можешь это сделать - person Shareef; 23.05.2019
comment
Я не понял, чем это поможет? - person mighty; 05.06.2019