带有对象/原型的链式承诺(Q延期)

Chained Promises (Q deferred) with Object / Prototype

本文关键字:承诺 延期 对象 原型      更新时间:2023-09-26

我有一个简单的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));