将问题与 Bluebird 承诺绑定

Bind issues with Bluebird promises

我在承诺和绑定方面遇到了一些困难。

我有 2 个班级:

// A Model/DB connnection of sorts
function Connection() {

}
Connection.prototype.findOrder = function(id) {
  // Returns promise
}


// The main class 
function Main(connector) {
  this.connector = connector;
}

Main.prototype.buildInvoice = function(report) {
  return P.map(ids, self.connector.findOrder.bind(self, id);
  // Yields: Cannot read property 'bind' of undefined
};

这样调用:

var connection = new Connection({
  connection: config.db.mongo.connection
});

var main = new Main({ connection: connection });

P.each(reports, main.buildInvoice.bind(main));

我 运行 陷入绑定问题。我第一次收到上面一行的错误:

Unhandled rejection TypeError: undefined is not a function

我随后添加了在 P.each(reports, main.buildInvoice.bind(main)); 上找到的 bind。但是,buildInvoice 方法也出现了同样的问题,但我还没有弄清楚语法。发布的代码产生 Cannot read property 'bind' of undefined

进行此调用的正确语法是什么:

Main.prototype.buildInvoice = function(report) {
  var self = this;
  return P.map(ids, self.connector.findOrder.bind(self, id);
};

这可能是一个与 promise 无关的问题,但我发帖时同时想知道我是否正确处理了这个流程。

一方面,您的调用 new Main({ connection: connection }); 与您的构造函数不匹配:

function Main(connector) {
  this.connector = connector;
}

它希望连接自己传递,而不是包装在对象中。因此,当为您传入的对象设置 .connector 时,它的 .findOrder 将是 undefined。使用

var main = new Main(connection);

其次,您需要 bind 连接对象的 findOrder 方法,而不是 self。哦,self 在 JS 中被称为 this。并且没有要部分应用的 id。所以使用

Main.prototype.buildInvoice = function(report) {
  return P.map(ids, this.connector.findOrder.bind(this.connector));
};