#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() . Я думаю, поскольку они находятся в той же области, которая вызывала проблему, я попробую это. Спасибо!