【发布时间】:2015-04-06 20:50:33
【问题描述】:
我有一个简单的 Javascript (Node) 对象,它有一个在对象上设置属性并返回承诺的函数。
注意,对于这个示例,我已经删除了需要延迟的实际异步调用,因为它不会影响结果。
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);
我很想知道是什么原因造成的。我最好的猜测是我的对象的方法链接在一起的方式存在闭包问题。
在大多数情况下,我会传递值以解决/拒绝并从那里开始。在这种情况下,我想通过一系列顺序函数(一些需要延迟)运行一些数据。我不想将输出传递给链中的每个函数,而是想在对象本身中存储和更新数据。
任何清晰度将不胜感激!
【问题讨论】:
-
试试
foo.set().then(foo.check.bind(foo)); -
啊,是的,这行得通。非常感谢!
-
我将其添加为答案 :-) 没问题,欢迎您
-
值得一提的是,其他库(如 bluebird)或者如果您可以使用 ES6(ala babeljs),这会变得方式更好。
标签: javascript closures prototype promise