带有对象/原型的链式承诺(Q延期)
Chained Promises (Q deferred) with Object / Prototype
我有一个简单的Javascript(Node)对象,它有一个函数,可以设置对象的属性并返回promise。
注意,对于这个例子,我已经删除了需要延迟的实际异步调用,因为它不会影响结果。
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);
我很想知道是什么原因造成的。我的最佳猜测是,我的对象的方法链接在一起的方式存在闭包问题。
在大多数情况下,我会将值传递给resolve/reject,然后从那里开始。在这种情况下,我想通过一系列顺序函数运行一些数据(有些需要延迟)。我不想将输出传递给链中的每个函数,而是希望在对象本身中存储和更新数据。
如有任何澄清,我们将不胜感激!
在没有上下文和this
的情况下调用回调的问题只是全局对象
作为一个解决方案,您需要像以下一样绑定上下文
foo.set().then(foo.check.bind(foo));
相关文章:
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 从函数返回角度承诺
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 在承诺链中处理早期回报的最佳方式
- 承诺在非节点式回调上使用Bluebird
- 简单的ES6承诺问题-交换解决和拒绝参数
- 组合承诺和非承诺值
- 带有对象/原型的链式承诺(Q延期)
- AngularJS$q承诺使用socket.io
- JavaScript中的延期/承诺概念是一个新的概念,还是函数式编程的传统部分
- 我可以在不创建延期的情况下报告Q承诺进度吗
- 有角度的延期承诺
- AngularJS的延期承诺
- 取消jQuery中的延期承诺
- 是否存在无法使用承诺而必须使用延期的情况
- 延期承诺&;Jquery
- 延期反模式承诺不明确的例子
- 有没有办法在延期承诺中提前返回