例如,从Angular.js中获取此代码:
app.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'page/hello.html',
controller: 'mainCount'
})
.when('/pag', {
templateUrl: 'page/hello.html',
controller: 'secondCount'
})
});
所以$routeProvider
是一个对象,似乎.when
(回调)是一个函数调用。如果是这样,上面这两个方法调用如何被“一个在另一个上面”调用?
通常,我希望这会发生:
object.method().method()
第二个方法调用第一个方法返回的对象。显然,上面的Angular示例中没有发生这种情况。那么这里发生了什么?
答案 0 :(得分:2)
Javascript中的回调真的是方法调用吗?
也许。作为一种方法与回调是正交的。
方法调用是指调用附加到对象的函数。
回调函数是作为参数传递给另一个函数调用的函数。
接受回调的函数可能会将其附加到对象并在该上下文中调用它,但不是必需的。
所以$ routeProvider是一个对象,它似乎是.when(回调)
when
在此实例中不是回调。 Promises有一个名为when
的方法,它接受一个回调作为参数,但你不是在这里处理一个承诺而你也没有将一个函数传递给when
。
.when(
回调)是一个函数调用。
是。 when
的返回值是一个对象。该对象与第一个when
被调用的对象相同,它仍然有一个名为when
的属性,其值是一个函数。
方法链接不是回调。
那么这里发生了什么?
明智的回报价值。看看这个简单的例子:
function Incrementor() {
this.value = 0;
}
Incrementor.prototype.up = function() {
this.value++;
return this;
}
var i = new Incrementor();
document.body.appendChild(
document.createTextNode(
i.up().up().up().value
)
);

答案 1 :(得分:0)
.when
的{{1}}方法正在返回$routeProvider
以允许链接。每次调用this
都会添加到已存储路由列表中。
.when
对于$routeProvider = function $routeProvider() {
this.routeList = [];
};
$routeProvider.prototype.when = function when(string,object) {
this.routeList.push(string, object);
return this;
};
承诺,$q
方法为.then
服务提供了一个函数,以便稍后$q
服务存储在其列表中或它的队列"但在这种情况下,它会返回一个新的承诺。每次连续调用$q
方法都会返回一个新的承诺。
这是非常重要的一点。承诺不会返回自己的变异版本。他们用.then
方法返回新的承诺。缺乏这种理解一直是许多图书馆开发人员的愚蠢行为。