Вложенный цикл For с асинхронным модулем в node.js

#node.js #asynchronous #async.js

#node.js #асинхронный #async.js

Вопрос:

Я пытаюсь выполнить вложенный цикл for с async модулем для обработки асинхронных nightmare функций обратного вызова. Итак, вкратце, что я делаю, так это то, что я запускаю несколько nightmare объектов в одном node экземпляре для перехода по разным ссылкам на веб-сайте.

Согласно тому, что я прочитал, я должен вызвать next() функцию, чтобы уведомить asyncOfSeries цикл о переходе к следующему индексу. Это нормально работает только с одним циклом for . Когда я вложил asyncOfSeries , внутренняя next() функция выполняется не во внутреннем цикле, а только во внешнем цикле.

Пожалуйста, посмотрите фрагмент кода, чтобы вы могли лучше понять:

  var Nightmare = require('nightmare');
 var nightmare = Nightmare({show:true})

var complexObject = {

 19:["11","12","13","14","15"],
 21:["16"],
 22:["17"],
 23:["18","19"]
};
//looping on each object property
async.eachOfSeries(complexObject, function(item, keyDo, next){
  //here im looping on each key of the object, which are arrays
  async.eachOfSeries(item, function(indexs, key, nexts){
    nightmare
    .//do something
    .then(function(body){

        nightmare
        .//do something
        .then(function(body2){

           nightmare
          .//do something
          .then(function(body3){

            //Here I call next() and expecting to call the next index of the inner loop
            //but is calling the next index of the outer loop and the inner for is just 
           // executing one time.
             next();
          });

        });

    });
 }); 
});
  

Я пытался вызвать другой next() после внутреннего цикла, но выдает ошибку. У кого-нибудь есть идея, почему внутренний цикл выполняется только один раз?

Комментарии:

1. Где вы объявляете переменную nightmare ?

2. Я отредактировал фрагмент. @stdob—

3. Поскольку вы используете promises, вам, вероятно, не следует использовать async.js . Они плохо составляются (и вы вообще не обрабатываете ошибки).

4. У вас опечатка: nexts вместо next . Вы должны вызвать внутренний next во внутреннем обратном вызове, и вы должны передать внешний next в качестве обратного вызова в eachOfSeries

Ответ №1:

Вам нужно управлять двумя обратными вызовами. Внутренний обратный вызов «следующий» и внешний обратный вызов «следующий». Вы вызываете внешний обратный вызов из своего внутреннего цикла.

Попробуйте это:

     var Nightmare = require('nightmare');
 var nightmare = Nightmare({show:true})

var complexObject = {

 19:["11","12","13","14","15"],
 21:["16"],
 22:["17"],
 23:["18","19"]
};
//looping on each object property
async.eachOfSeries(complexObject, function(item, keyDo, next){
  //here im looping on each key of the object, which are arrays
  async.eachOfSeries(item, function(indexs, key, nexts){
    nightmare
    .//do something
    .then(function(body){

        nightmare
        .//do something
        .then(function(body2){

           nightmare
          .//do something
          .then(function(body3){

            //Here I call next() and expecting to call the next index of the inner loop
            //but is calling the next index of the outer loop and the inner for is just 
           // executing one time.
             nexts();
          });

        });

    });
 }); 
next();
});
  

Комментарии:

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