2009-12-19 1 views
0

Сегодня я работаю над проектом для домашних животных, используя цепные вызовы функций, и мне любопытно, как я могу обнаружить, когда выполняется последняя функция в цепочке. Например:javascript - обнаружение конца цепочки функций?

func1('initial data').func2().func3().func4(); 

И после того, как func2-4 закончил работу над «исходными данными» Я хотел бы, чтобы обнаружить, когда func4 делаются. Поскольку func4() не всегда является последней функцией в цепочке, например, она может заканчиваться на .func3() или .func5(), например, или я мог бы смешивать вызовы функций в зависимости от того, что я пытаюсь сделать, Я пытаюсь придумать способ обнаружить больше вызовов функций, но я не очень далеко.

+0

Если функции синхронны, то в этом нет ничего особенного. Функция выполняется, когда она возвращается, независимо от того, ее цепь или нет. –

ответ

4

Вы не можете.

Кроме того, если они не прикован:

var v = func1('initial data'); 
v = v.func2(); 
v = v.func3(); 
v = v.func4(); 

Что бы вы считаете последняя функция? Каждая функция является последней функцией в своей собственной цепочке, но если вы завершите что-то после каждого шага, это не сработает.

Просто выполните функцию, которую вы называете последним, чтобы завершить процесс.

+1

Да, это в основном то, что я уже сделал. Я создал функцию done(), поэтому я бы сделал цепочку как func1(). Func2(). Func3(). Done(); В настоящее время он работает достаточно хорошо. – Geuis

+0

Конечно, вы можете. Когда функция возвращается, функция завершается. –

+0

@ Justin: Вы неправильно поняли вопрос. Он не хочет знать, когда функция EACH завершена, он хочет знать, когда функция LAST завершена. – Guffa

4

Традиционный подход положить все, что вы хотите сделать после окончательной функции на следующей строке:

func1('initial data').func2().func3().func4(); 
allFunctionsDone(); 

;)

+0

Точно. В этом вопросе отмечается странный или загадочный вопрос. Когда JavaScript выполняется синхронно, он ведет себя как любой другой процедурный язык. Когда функция вернется, она будет выполнена, а затем вы сможете продолжить. –

3

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

executeSequence(func1('init_dat'),[ 
    'func2', 
    'func3', 
    'func4' 
]); 
+0

Существует нулевое преимущество. –

+0

Я проголосовал за это, потому что есть преимущество, если один из возвращаемых объектов может иметь или не иметь следующий метод в цепочке. Секвенсор может проверить, существует ли следующий метод перед его вызовом. – Rich

+0

@Justin Johnoson, IMHO: Это полностью зависит от того, как и в каком контексте вы используете этот код. Если вы создаете какой-либо динамический код, который можно параметризовать, с вложенными секвенсорами, с обработкой ошибок, процедурами start() и stop() и т. Д., Это может быть весьма полезно. – nemisj

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

  • Нет связанных вопросов^_^