javascript - 带有对象/原型(prototype)的链式 Promise(Q 延迟)

标签 javascript closures prototype promise

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

当上面的代码以如下所示的破坏 promise 的方式调用时,this.bar 为 true(如预期)。

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

但是,当在链中调用它时,它是未定义的:

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

我很想知道是什么原因造成的。我最好的猜测是我的对象的方法链接在一起的方式存在闭包问题。

在大多数情况下,我会传递值来解析/拒绝并从那里开始。在本例中,我想通过一系列顺序函数运行一些数据(有些需要延迟)。我不想将输出传递给链中的每个函数,而是想存储和更新对象本身中的数据。

如有任何澄清,我们将不胜感激!

最佳答案

在没有上下文的情况下调用回调并且 this 只是全局对象的问题

作为解决方案,您需要像这样绑定(bind)上下文

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

关于javascript - 带有对象/原型(prototype)的链式 Promise(Q 延迟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29479460/

相关文章:

C 标准 - 函数定义是函数原型(prototype)吗?

javascript - 在 Chrome 扩展中的生成窗口上运行 Javascript

javascript - Jquery点击功能完全执行后才能重新点击

javascript - 在 Electron 中获取剪贴板类型

java - Groovy 中的闭包 - 用等效的 Java 实现

loops - 在 Groovy 中何时使用 `each` 以及何时使用 `for` 循环

gradle - 在根中定义的闭包在 child 中不可见

javascript - 为什么使用 Javascript 对象而不是原型(prototype)

javascript - 固定页脚和页眉时的 HTML 布局动态内容高度

javascript - 不能使用 String#trim 作为 Array#map 的回调