文档说 promise 链的工作原理如下
return getUsername()
.then(function (username) {
return getUser(username);
})
.then(function (user) {
如果下面的方法也能工作,那不是很好吗?
return getUsername()
.then(getUser)
.then(function (user) {
我偶然发现了它,因为这是我凭直觉所做的,但它不起作用。
非常感谢
最佳答案
是的,它有效。
它可能失败的原因有两个:变量 vs 函数提升或动态 this
。
提升和变量定义。
两者的区别:
var foo = bar;
还有:
var foo = function(x){ return bar(x); }
鉴于它的 bar 的签名是在第二个片段中 bar
被延迟评估。因此,如果 bar
未定义,您将在第一个示例中收到错误,但在第二个示例中不会收到错误。大多数 Promise 库都会忽略(并且由于规范而必须这样做)传递给 then
的 undefined
并简单地返回相同的 Promise。
您的示例中的此问题可能如下所示:
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 成为一个依赖于 this
的未绑定(bind)函数。请记住,JavaScript 具有动态 this
,因此您不能简单地执行以下操作:
return getUsername()
.then(someObj.getUser) // this won't work, pun intended
.then(function (user) {
现在,为了使其工作 - 您可以绑定(bind)它,例如:
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) {
或者将较长的版本与函数表达式一起使用。
这可能不是您的具体问题 - 但十分之九的人问这个问题 - 它解决了他们的问题。
关于node.js Q Promise 然后是 Promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28524443/