Узел - Асинхронный водопад с петлей - PullRequest
0 голосов
/ 08 мая 2018

У меня проблемы с пониманием async.waterfall при использовании цикла for:

Итак, я использую следующий водопад:

async.waterfall([
    addVertices,
    countVertices
], finish);

с тремя способами ниже.

Однако проблема, с которой я сталкиваюсь, заключается в том, что результат в countVertices не точен, то есть иногда должен быть 2, а иногда 1, когда он всегда должен показывать 2.

Это наводит меня на мысль, что обратный вызов из addVertices фактически не вызывается после завершения цикла for.

Может ли кто-нибудь помочь - это неправильно при вызове обратного вызова, когда цикл for достигает последней итерации?

function addVertices(callback) {
    for (var x = 0; x < pData.length; x++) {

        client.execute("g.addV(‘test’).property(‘id’, \"" + pData.id + "\")", { }, (err, results) => {
            if (err) {
                return callback(console.error(err));
            }
        });

        if (x == pData.length-1 ){
            callback(null)
        }

    }

}


function countVertices(callback)
{
    console.log('Running Count');
    client.execute("g.V().count()", { }, (err, results) => {
    if (err) {
        return callback(console.error(err));
    }

    console.log("Result: %s\n", JSON.stringify(results));
    callback(null)
});
}


function finish(err, result)
{
    if (err) {
        return console.error(err);
    }
    console.log("Finished");
    console.log('Press any key to exit');

    process.stdin.setRawMode(true);
    process.stdin.resume();
    process.stdin.on('data', process.exit.bind(process, 0));
}

1 Ответ

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

Проблема в addVertices. Вы можете решить эту проблему, заменив оператор for на async.forEach

function addVertices(outercallback) {
    async.forEach(pData, function (data, innercallback) {
      client.execute("g.addV('test').property('id', \"" + data.id + "\")", { }, innercallback);
    }, outercallback);
}
...