2015-07-15 4 views
0

crawler.js В:Nodejs - Почему моя переменная в классе не определена?

var async = require('async'); 
var request = require('request'); 
var cheerio = require('cheerio'); 
var Helper = require('./helper.js'); 
var helper = new Helper(); 

var Crawler = function(){ 

    var me = this; 

    this.listCategory; 

    this.getCategory = function(){ 

     //1. not use async : test key input is idMenu 
     helper.categoryInMenu(1, function(err, result){ 
      me.listCategory = result; 
     }); 

     //2. use async : test key input is idMenu 
     async.map([1], helper.categoryInMenu, function(err, result){ 
      me.listCategory = result; 
      //console.log(result); 
     }); 

     console.log(me.listCategory); // return undefined 

    } 
} 

module.exports = Crawler; 

Когда я установил me.listCategory = result;result != null) затем вызвать listCategory в файле main.js или console.log его в файле crawler.js.

Отображается в команде undefined.

Файл main.js

var Crawler = require('./crawler.js'); 
var snipper = new Crawler(); 

snipper.getCategory(); 
console.log(snipper.listCategory); 

Я пытаюсь использовать async модуль с функцией map, она не работает.

Возможно, я не установлен me.listCategory = return of function helper.categoryInMenu.

Файл helper.js

var db = require('mysql'); 
var config = require('./configLoader.js'); 
config.load(__dirname+'/config.json'); 

var Helper = function(){ 

    var me = this; 
    this.conn = db.createConnection(config.get('db')); 

    this.menu = function(callback){ 
     me.conn.query("SELECT * FROM `menu`", function(err, rows){ 
      callback(err, rows); 
     }); 
    } 

    // return list category with "input" is a idMenu 
    this.categoryInMenu = function(idMenu, callback){ 
     me.conn.query("SELECT * FROM `category` WHERE idMenu = ?", idMenu, function(err, rows){ 
      callback(err, rows); 
     }); 
    } 

    // return config of Category with "input" is a idCategory (Category) 
    this.dom = function(idCategory, callback){ 
     me.conn.query("SELECT * FROM `category` WHERE id = ?", idCategory, function(err, rows){ 
      callback(err, JSON.parse(rows[0].dom)); 
     }); 
    } 

} 

module.exports = Helper; 
+0

Я не уверен в async, но метод map() создает новый массив, который вы должны вернуть. '' 'me.listCategory = async.map ([1], helper.categoryInMenu, функция (ERR, результат) { возврата me.listCategory = результат; //console.log(result); }); '' ' – gearsdigital

+0

Я удалил свой ответ, поскольку я не могу проверить это. Также ваш метод '' this.getCategory''' должен возвращать что-то. – gearsdigital

+0

Посмотрите здесь: https://gist.github.com/gearsdigital/0df212c86cf1a2c1f127 – gearsdigital

ответ

0

Карта на всех языках используется для преобразования значения Iterable в нечто другое, поэтому вы должны вернуться в функции обратного вызова, и результат будет новый массив, содержащий только возвращаемая значения. Если вам нужно только итерации, вы должны использовать arr.forEach (> ES5) или простой цикл for.

Ваша проблема в том, что async.map является асинхронным, что означает, что console.log(me.listCategory); выполняется до фактической карты.

Array.map на самом деле стандарт ES5, поэтому вам не нужно async модуль для отображения массивов, также родной map является синхронным.

+0

спасибо :) Я смотрю пример [http://book.mixu.net/node/ch7.html](http://book.mixu.net/node/ch7.html). Возможно, я буду использовать обратный вызов (вызов другого метода в нем) –

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