2015-11-21 2 views
0

Например, возьмите этот код из Angular.js:Являются ли обратные вызовы в Javascript действительно вызовами методов? Если да, то как они «каскадируются»?

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

второй метод вызывается для объекта, возвращенного первым способом. Ясно, что этого не происходит в приведенном выше Угловом примере. Так что здесь происходит?

+0

Хм, я полагаю, метод 'when()' возвращает '$ routeProvider', позволяя вам продолжать вызывать функции на нем? – Arg0n

+0

'.when' является вызовом метода и не имеет ничего общего с обратными вызовами. – Bergi

ответ

2

Являются ли обратные вызовы в Javascript действительно методами вызовов?

Возможно. Метод является ортогональным для обратного вызова.

Вызов метода - это когда вызывается функция, привязанная к объекту.

Обратный вызов - это функция, передаваемая в качестве аргумента для вызова другой функции.

Возможно, что функция, которая принимает обратный вызов, привяжет ее к объекту и вызовет его в этом контексте, но не обязательно.

Так $ routeProvider является объектом, и, похоже, .when (обратный вызов)

when не обратного вызова в данном случае. У обещаний есть метод when, который принимает обратный вызов как аргумент, но вы не имеете дело с обещанием здесь, и вы не передаете функцию when.

.when ( callback ) является вызовом функции.

Да. Возвращаемое значение 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 
 
) 
 
);

+0

Большое спасибо, теперь имеет смысл. Javascript - непостоянный язык. – Warrshrike

+0

Принимается как ответ. Оба ответа были правильными, но я чувствовал, что это более близко ответило на исходный вопрос. – Warrshrike

0

Метод $routeProvider.when возвращает его 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 возвращает новое обещание.

Это чрезвычайно важный момент. Обещания не возвращают измененные версии самих себя. Они возвращают новые обещания с помощью своего метода .then. Отсутствие этого понимания было глупостью многих разработчиков библиотеки.

+0

Интересно. Таким образом, в случае обещания $ q, если вы назовете. 10 раз с различными функциями в качестве параметров, даст ли вам 10 новых обещаний (а не то же самое обещание с 10 функциями в нем)? – Warrshrike

+0

@Warrshrike Да. Но остерегайтесь '.success'. Это глючит. Он возвращает ** старое ** обещание. Вот почему он устарел. Для получения информации об устаревании '.success' смотрите последние [AngularJS $ http API Docs] (https://docs.angularjs.org/api/ng/service/$http) – georgeawg

+0

Спасибо. Имеет смысл. – Warrshrike

Смежные вопросы