文档说承诺的链接就像
一样return getUsername()
.then(function (username) {
return getUser(username);
})
.then(function (user) {
如果以下内容也能正常工作,那会不会很好?
return getUsername()
.then(getUser)
.then(function (user) {
我偶然发现它,因为这是我直觉所做的,而且它没有用。
非常感谢
答案 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人问这个 - 它解决了他们的问题。