与Bluebird承诺绑定问题

时间:2015-08-05 17:13:30

标签: javascript promise bluebird

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

我有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

我随后添加了bind上找到的P.each(reports, main.buildInvoice.bind(main));。然而,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);
};

这可能是一个非承诺相关的问题,但我发布的是这样,因为我同时想知道我是否正确处理此流程。

1 个答案:

答案 0 :(得分:1)

首先,您的通话new Main({ connection: connection });与您的构造函数不匹配:

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

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

var main = new Main(connection);

其次,您需要bind findOrder方法连接对象,而不是self。哦,JS中self被称为this。而且你想要部分申请id。所以使用

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