2013-09-27 3 views
1

У меня есть этот код:Вызов функции из внутри обратного вызова ASync внутри объекта

var async = require("async"); 

module.exports = function(vars){ 

    return { 

     a: function(){ 
      console.log("a()"); 
     }, 

     b: function(){ 

      var self = this; 

      async.series([ 
       function(callback){ 
        ... 
        callback(); 
       }, 
       function(callback){ 
        ... 
        callback(); 
       } 
      ], function(){ 
       self.a(); // <------- err 
      }); 
     } 

    } 
} 

Тогда я звоню б как:

var test = require("./test.js")({}); 
test.b(); 

, но я получаю эту ошибку: Object #<Object> has no method 'a'. Зачем?

Edit:

К сожалению, этот код на самом деле работает хорошо, но я получаю эту ошибку в моем коде производства.

Единственное отличие от этого примера (который работает правильно), и мой код (который не делает) , что мой демонстрационный код вызывается непосредственно:

var test = require("./test.js")({}); 
test.b(); 

в то время как мой код продукции вызывается из другой библиотеки :

var my_code = require("./something.js")({}); 
imap_notify.on_new_mail(my_code.my_func); 
+0

как метод 'b' называется? –

+0

@ArunPJohny проверить мое редактирование, пожалуйста – alexandernst

+0

self = b в этом примере – Armand

ответ

1

Проблема заключается в том, что внешняя библиотека, вероятно, меняет контекст (вызов вашей функции с помощью .bind(this)).

Вы можете сохранить свой объект в одной переменной и вызвать его непосредственно

module.exports = function(vars){ 

    var obj = { 

     a: function(){ 
      console.log("a()"); 
     }, 

     b: function(){ 

      // var self = this; // useless now 

      async.series([ 
       function(callback){ 

        callback(); 
       }, 
       function(callback){ 

        callback(); 
       } 
      ], function(){ 
       obj.a(); // <--- now it works 
      }); 
     } 

    }; 

    return obj; 
} 
+0

Да, это было решение :) В любом случае, мне интересно, почему мой путь не работает. (Я не вижу связей в функции «on_new_mail») – alexandernst

0

Попробуйте это, не знаю, если это действительно хотя

var async = require("async"); 

var Item = function(){ 
    self= this; 

    self.a= function(){ 
     console.log("a()"); 
    }, 

    self.b= function(){ 



     async.series([ 
      function(callback){ 
       ... 
       callback(); 
      }, 
      function(callback){ 
       ... 
       callback(); 
      } 
     ], function(){ 
      self.a(); // <------- err 
     }); 
    } 
} 



module.exports = function(){ 

    return new Item(); 

} 
+0

Это не так. 'this' ===' module'. – Andy

+0

Действительно, это неверно. – alexandernst

+0

Даже если это было действительно, это не помогает в том, что идея сохранения 'this' в качестве локальной переменной позволяет разрешить доступ к ней в анонимных функциях, где контекст больше не является объектом. – Adam

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