Узел Async - Callback уже был вызван - используется 2 для циклов и оператор if - PullRequest
0 голосов
/ 11 мая 2018

Может кто-нибудь объяснить, почему я продолжаю видеть Error: Callback was already called.

Я чувствую, что охватил все случаи - так почему бы «уже называться»:

function addVertices(outercallback) {

    async.forEachLimit(fullData, 25, function (data, innercallback) {

        myJson.matches.forEach(function (oMatches) {
            if (data.$.id == oMatches.SourceId) {

                oMatches.Ids.forEach(function (oId) {

                    client.execute("g.addV('test').property('id', \"" + oId + "\")", {}, (err, results) => {
                        if (err) {
                            return innercallback(console.error(err));
                        }

                        innercallback(null)
                    });

                })

            } 

        })

    }, outercallback);

}

Infact Я также пытался заменить этот второй forEach на async.ForEach, как показано ниже, однако это правильный путь?:

function addVertices(outercallback) {

    async.forEachLimit(fullData, 25, function (data, innercallback) {

        async.forEach(myJson, function (oMatches, innercallback2) {
            if (data.$.id == oMatches.SourceId) {

                oMatches.Ids.forEach(function (oId) {

                    client.execute("g.addV('test').property('id', \"" + oId + "\")", {}, (err, results) => {
                        if (err) {
                            return innercallback2(console.error(err));
                        }

                        innercallback2(null)
                    });

                })

            } 
            innercallback(null)

        })

    }, outercallback);

}

1 Ответ

0 голосов
/ 14 мая 2018

Это не проблема if.

Но поскольку в каждой итерации async.forEachLimit, innercallback вызывается в myJson.matches.forEach(...), который мог быть вызван несколько раз, так как myJson.matches может быть больше 1 элемента.

Та же проблема во втором блоке кода.
Во внутреннем async.forEach, innercallback2 вызывается в oMatches.Ids.forEach, который также может вызываться несколько раз.

Следовательно, Error: Callback was already called утверждается, когда происходит ваш второй вызов (или любые последующие вызовы) на innercallback.

Я обновил решение с помощью Promise#all, чтобы обеспечить вызов innercallback в исходном сообщении . См. Updated (2018.05.14) часть и кодовый блок.

...