2015-10-30 2 views
0

У меня есть следующий массив:Обратный звонок уже называется модуль асинхронной

var files = [ 
{ 
    name: 'myfile.txt' 
}, 
{ 
    name: 'myfile2.txt' 
} 
]; 

Я использую асинхр для доступа к этим объекты и отправить их на добычу, как это: функция

экстракции:

var extraction = function(file, callback) { 
    // extract 

    // return text 
    callback(text); 
}; 

Использование асинхронной

var fn = function(files, callback) { 
    Async.mapLimit(files, 3000, function(file, done) { 
    extraction(file, function(texts) { 
    done(texts); 
    }); 
    } 
}, function(texts) { 
    callback(texts); 
} 

Как мне нужно позвонить:

fn(files, function(texts) { 
console.log(texts); // new objects, now with text's 
}); 

Подобно этому, я получаю следующее сообщение об ошибке:

Done was already called. 

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

Чтобы обойти эту проблему, я делаю это внутри Async:

if (files.length === texts.length) { 
    done(texts); 
} 

Так будет сравнивать. Размер файлов такой же, как размер текста? Да? Таким образом, вы можете сделать это.

Это будет работать отлично. Проблема в том, что я не могу передать аргумент ошибки внутри другое заявление, например:

if (files.length === texts.length) { 
    done(null, texts); 
} else { 
    done('ERROR'!); 
} 

Во-первых, потому что было бы заехать в каждом цикле, так что вызовет ту же ошибку:

Done was already called. 

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

Как я могу это исправить? Мне нужен свет здесь:/

ответ

0

Этот код не приготовился правильно и аргументы обратного вызова не были в правильном положении в нескольких местах:

var fn = function(files, callback) { 
    Async.mapLimit(files, 3000, function(file, done) { 
    extraction(file, function(texts) { 
    done(texts); 
    }); 
    } 
}, function(texts) { 
    callback(texts); 
} 

Оно должно быть:

var fn = function (files, callback) { 
    Async.mapLimit(files, 3000, function (file, done) { 
     extraction(file, function (texts) { 
      done(null, texts); 
     }); 
    }, function (err, texts) { 
     callback(texts); 
    }); 
} 

Async.mapLimit() принимает четыре аргумента. Вы не правильно приняли четвертый аргумент. Фактически, если вы вставляете код в http://jshint.com/, он покажет вам, где ошибки (откровенно удивляюсь, что код даже работал).

Вот статья, которая показывает некоторые Async.mapLimit() кодирования примеров, которые работают так же, как вы пытаетесь сделать: Concurrency level (async.mapLimit)

+0

@ JoãoCalvin - Я сделал еще несколько исправлений. Выполненный обратный вызов должен передать значение ошибки в качестве первого аргумента («null», если нет ошибки). И, последний обратный вызов вызывается с данными в качестве второго аргумента, первым является аргумент кода ошибки. Кроме того, является 'extract()' асинхронным? – jfriend00

+0

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

+0

спасибо !! @ jfriend00 –

Смежные вопросы