node.js Q承诺然后链接承诺

时间:2015-02-15 08:49:06

标签: node.js promise q chaining

文档说承诺的链接就像

一样
return getUsername()
  .then(function (username) {
     return getUser(username);
  })
  .then(function (user) {
如果以下内容也能正常工作,那会不会很好?

return getUsername()
  .then(getUser)
  .then(function (user) {

我偶然发现它,因为这是我直觉所做的,而且它没有用。

非常感谢

1 个答案:

答案 0 :(得分:1)

是的,它有效。

它可能会失败的原因有两个:变量与功能提升或动态this

吊装和变量定义。

区别:

var foo = bar;

var foo = function(x){ return bar(x); }

鉴于它的标记是第二个代码段bar被懒惰评估。因此,如果未定义bar,您将在第一个示例中收到错误,但不会在第二个示例中收到错误。大多数承诺库忽略(并且由于规范而必须)undefined传递给then并简单地返回相同的承诺。

您的示例中的此问题可能如下所示:

return getUsername()
  .then(function (username) {
     return getUser(username); // note it's a method
  })
  .then(function (user) { ...

// later on in the file after the function ended
var getUser = function(){
    // because of the function wrap above, this will work since 
    // the function(){ causes it to be lazily evaluated
};

另一方面做:

return getUsername()
  .then(getUser)
  .then(function (user) {

// later on in the file outside the function
var getUser = function(username){
       // code here
};

与做:

相同
return getUsername()
  .then(undefined) // remember, promises ignore this
  .then(function (user) {

这与JavaScript如何处理变量的挂起以及函数声明的托管有关。

动态

它不起作用的原因是你的代码实际上看起来有点不同。您的代码更像是:

return getUsername()
  .then(function (username) {
     return someObj.getUser(username); // note it's a method
  })
  .then(function (user) {

实际上getUser正在访问其中的this - 这使得这是一个取决于this的未绑定函数。请注意,JavaScript具有动态this,因此您无法做到:

return getUsername()
  .then(someObj.getUser) // this won't work, pun intended
  .then(function (user) {

现在,为了使其工作 - 你可以绑定它,例如:

return getUsername()
  .then(someObj.getUser.bind(someObj) // IE9+
  .then(function (user) {

// if using bluebird, this is faster:
return getUsername().bind(someObj)
  .then(someObj.getUser) 
  .then(function (user) {

或者使用带有函数表达式的较长版本。

这可能不是你的具体问题 - 但是有10分钟中有9人问这个 - 它解决了他们的问题。