2015-04-06 4 views
2

У меня есть простой объект Javascript (Node), который имеет функцию, которая устанавливает свойство объекта и возвращает обещание.Chained Promises (Q отложен) с объектом/прототипом

Примечание. В этом примере я удалил фактический асинхронный вызов, который должен быть отложен, так как он не влияет на результат.

var q = require("Q"); 

var Foo = function(){ 
    this.bar = false; 
    return this; 
}; 

Foo.prototype.set = function(){ 
    var d = q.defer(); 
    this.bar = true; 
    d.resolve(); 
    return d.promise; 
}; 

Foo.prototype.check = function(){ 
    var d = q.defer(); 
    console.log(this.bar); 
    d.resolve(); 
    return d.promise; 
}; 

Когда вышесказанное называется способом обезвреживания, как показано ниже, this.bar является истинным (как и ожидалось).

var foo = new Foo(); 
foo.set().then(function(){ 
    foo.check(); 
}); 

Однако, когда его называют в цепи, это не определено:

foo.set().then(foo.check); 

Мне интересно понять, что причиной этого. Мое лучшее предположение - проблема закрытия с тем, как методы моего объекта соединены вместе.

В большинстве случаев я передавал значение для разрешения/отклонения и перехода оттуда. В этом случае я хочу запустить некоторые данные через ряд последовательных функций (некоторые требуют отсрочки). Вместо того, чтобы передавать выходные данные каждой функции в цепочке, я хочу сохранить и обновить данные в самом объекте.

Любая ясность была бы очень признательна!

+0

Попробуйте 'foo.set(). Затем (foo.check .bind (foo)); ' –

+0

Ах да, это работает. Большое спасибо! – JKE

+0

Я добавил его в качестве ответа :-) без проблем. –

ответ

3

Проблемы вы вызываете обратный вызов без контекста и this только глобального объект

В качестве решения вы должны связать контекст как этот

foo.set().then(foo.check.bind(foo));