【问题标题】:Chained Promises (Q deferred) with Object / Prototype带有对象/原型的链式承诺(Q 延迟)
【发布时间】: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


【解决方案1】:

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

作为一种解决方案,您需要像这样绑定上下文

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

【讨论】:

    猜你喜欢
    • 2013-09-11
    • 2016-12-08
    • 2017-05-08
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2011-06-30
    • 2015-06-22
    • 2014-11-16
    相关资源
    最近更新 更多