用于在promises

时间:2016-04-08 10:15:44

标签: javascript node.js design-patterns

假设我有一个函数,我在其中访问一个我无法更改的接口(在本例中为mongoose)。接口返回一个只传递找到的资源的承诺;

show = function(response) {
  Resource.findById(req.params.id).then(renderResource);
}

function renderResource(resource) {
  // render the response
}

为了呈现响应,我需要访问response函数中的show参数。我可以使用bind函数,劫持this作为响应变量;

show = function(response) {
  Resource.findById(req.params.id).then(renderResource.bind(response));
}

function renderResource(resource) {
  this.send(resource);
}

但是如果我想将另一个参数传递给renderResource函数呢?我设法做到的唯一方法就是这样;

show = function(response) {
  Resource.findById(req.params.id).then(function(resource) {
    renderResource.call(response, resource, "foo"));
  }
}

function renderResource(resource, otherArg) {
  this.send(resource);
  //do something with otherArg
}

但此时我不再对代码感到满意,因为;

  • 我必须声明一个函数文字,并且正在努力回调地狱。
  • 我纯粹使用call,所以我仍然可以在函数中使用this,但实际上到目前为止我还可以传入response作为第三个arg。

我确信必须有一种模式或某种东西以更简洁的方式处理这个问题,而不必声明一个新的函数文字。谁能提出一个模式?有没有更简洁的方法来处理这种情况?

1 个答案:

答案 0 :(得分:2)

您可以根据需要将尽可能多的参数传递给bind。我会避免使用this作为传递参数的方法来避免混淆。

show = function(response) {
  Resource.findById(req.params.id)
    .then(renderResource.bind(null, response, "foo"));
}

function renderResource(response, otherArg, resource) {
  response.send(resource);
  //do something with otherArg
}

有关详细信息,请参阅bind文档:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

这被称为部分应用:
https://en.wikipedia.org/wiki/Partial_application