Как выполнить функцию Javascript только после завершения нескольких других функций?

Моя конкретная проблема заключается в том, что мне нужно выполнить (потенциально )большое количество функций Javascript для подготовки чего-то вроде пакетного файла (каждый вызов функции добавляет некоторую информацию в тот же пакетный файл ), а затем, после все эти вызовы завершены, выполните последнюю функцию для отправки пакетного файла (, скажем, отправьте его как ответ HTML ). Я ищу общий шаблон программирования Javascript для этого.

Обобщить задачу :Учитывая функции Javascript funcA (), funcB ()и funcC (), я хотел бы найти лучший способ упорядочить выполнение, чтобы funcC выполнялся только после выполнения funcA и funcB. Я знаю, что мог бы использовать вложенные функции обратного вызова, подобные этой:

funcA = function() {
    //Does funcA stuff
    funcB();
}
funcB = function() {
    //Does funcB stuff
    funcC();
}

funcA();

Я мог бы даже сделать этот шаблон немного более общим, передав параметры обратного вызова, однако это решение становится довольно подробным.

Я также знаком с цепочкой функций Javascript, где решение может выглядеть так:

myObj = {}
myObj.answer = ""
myObj.funcA = function() {
    //Do some work on this.answer
    return this;
}
myObj.funcB = function() {
    //Do some more work on this.answer
    return this;
}
myObj.funcC = function() {
    //Use the value of this.answer now that funcA and funcB have made their modifications
    return this;
}
myObj.funcA().funcB().funcC();

Хотя это решение кажется мне немного чище, по мере того, как вы добавляете больше шагов к вычислению, цепочка выполнения функций становится все длиннее и длиннее.

Для моей конкретной задачи порядок выполнения funcA, funcB и т. д. НЕ имеет значения. Таким образом, в приведенных выше решениях я технически выполняю больше работы, чем требуется, потому что размещаю все функции в последовательном порядке. Для меня важно только то, что funcC (некоторая функция для отправки результата или запуска запроса )вызывается только после того, как funcA и funcB ВСЕ завершили выполнение. В идеале funcC мог бы каким-то образом прослушивать все промежуточные вызовы функций для завершения, а ТОГДА выполняться?Я надеюсь изучить общий шаблон Javascript для решения такой проблемы.

Спасибо за вашу помощь.

Другая идея :Может быть, передать общий объект в funcA и funcB, и когда они завершат выполнение, пометить общий объект, например, sharedThing.funcA = «complete» или sharedThing.funcB = «complete», а затем каким-то образом? выполнять funcC, когда общий объект достигает состояния, в котором все поля отмечены как завершенные. Я не уверен, как именно вы можете заставить funcC ждать этого.

Изменить :Я должен отметить, что я использую Javascript на стороне сервера -(Node.js ), и я хотел бы изучить шаблон для его решения, используя простой старый Javascript (без использования jQuery или других библиотек. ). Наверняка эта проблема достаточно общая, чтобы существовало чистое -Javascript-решение?

19
задан dgh 30 June 2012 в 22:31
поделиться