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

该文件说,承诺链接工程

return getUsername() .then(function (username) { return getUser(username); }) .then(function (user) { 

如果下面的工作也不会好起来吗?

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

我偶然发现了这一点,因为这是我直觉上所做的,并没有奏效。

非常感谢

是的,它的工作。

有两个原因可能会失败:variablesVSfunction提升或dynamicthis

提升和variables定义。

之间的区别:

 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如何处理提升variables与托pipe函数声明有关。

dynamic这个

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

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

而实际上getUser正在访问this里面 – 这使得这是一个非绑定的函数,这取决于this 。 请记住,JavaScript有dynamic的,所以你不能简单地做:

 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) { 

或者使用functionexpression式的较长版本。

这可能不是你的具体问题 – 但有人问这个问题的时候有9次 – 它解决了他们的问题。