2014-09-05 3 views
0

Я пытаюсь узнать, как использовать модуль асинхронной в Node.js и я впадаю в следующей задаче:Асинхронный итератора дает TypeError: не определено не является функцией

я первый написал этот сценарий, который отлично работает (к моему пониманию)

var async = require('async'); 
var seconds_values = []; 

process(); 

function process() { 
    var names = ['One', 'Two', 'ten', 'hello']; 

    modifications(names); 
} 

function modifications(somenames) { 
    async.each(somenames, function (one_name, callback) { 
     var random_num = Math.floor((Math.random() * 100000000) + 1); 

     seconds_values.push(one_name + '_' + random_num); 
     callback(); 
    }, function(err){ 
     async.each(seconds_values, function (one_value, callback) { 
      console.log(one_value); 
      callback(); 
     }, 
     function(err){ 
      console.log('==== The END ==='); 
     }); 
    }); 
} 

Я попытался присвоить итератору переменную, чтобы сделать код более читаемым.

var async = require('async'); 
var seconds_values = []; 

process(); 

function process() { 
    var names = ['One', 'Two', 'ten', 'hello']; 

    modifications(names); 
} 

var first_function = function (one_name, callback) { 
    var random_num = Math.floor((Math.random() * 100000000) + 1); 

    seconds_values.push(one_name + '_' + random_num); 
    callback(); 
} 

function modifications(somenames) { 
    async.each(somenames, first_function, function(err){ 
     async.each(seconds_values, function (one_value, callback) { 
      console.log(one_value); 
      callback(); 
     }, 
     function(err){ 
      console.log('==== The END ==='); 
     }); 
    }); 
} 

Второй сценарий дает мне следующую ошибку:

iterator(x, only_once(done)); 
     ^
TypeError: undefined is not a function 

Я думаю, что я что-то отсутствует основополагающий здесь. Не могли бы вы указать, что, если возможно?

ответ

1

Ошибка возникает, поскольку при запуске process он вызывает modifications, но на данный момент first_function еще не определен.

Вы можете иметь два варианта:

1.Put декларации до процесса вызова:

var first_function = function (one_name, callback) { 
    var random_num = Math.floor((Math.random() * 100000000) + 1); 

    seconds_values.push(one_name + '_' + random_num); 
    callback(); 
} 
process(); 

2. Использование функции декларации:

function first_function(one_name, callback) { 
    var random_num = Math.floor((Math.random() * 100000000) + 1); 

    seconds_values.push(one_name + '_' + random_num); 
    callback(); 
} 

Также смотрите здесь: Link

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