Использование внешнего класса ожидания для приостановки выполнения функций JavaScript - PullRequest
0 голосов
/ 03 июля 2011

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

function main_function(){   
   function a();
   // wait for function a to finish - could take 1 second - could take 3 seconds

   function b();
   // wait for function b to finish - don't know how long this will take

   function c();
   // completed
}

Я прочитал десятки статей о том, как использовать setTimeOut, перенаправляет на другие функции, обратные вызовы и т. Д., Но не смог найти решение, котороедействительно работал хорошо (и большинство из них просто используют неуклюжий setTimeout (), который действительно не помогает, так как я понятия не имею, сколько времени может занять каждая функция).

Итак, я наконец наткнулся на небольшую утилитуназывается "WaitThread.js".Похоже, это именно то, что мне нужно сделать, и кажется, что это будет что-то, что легко читать и поддерживать позже.

Однако я не могу понять, как его использовать!:)

Кто-нибудь сможет дать мне пример того, как использовать этот файл WaitThread.js?Или, по крайней мере, предоставьте мне читабельный / элегантный способ ожидания выполнения функций javascript одна за другой в ожидании завершения каждой из них в первую очередь?

Вот ссылка на страницу WaitThread.js:

http://www.robertmayo.com/blog/2006/07/htmljavascript-wait-for-asynchronous.html

Спасибо!

1 Ответ

1 голос
/ 03 июля 2011

Согласно объяснению для waitthread.js, он просто использует таймер для опроса, ожидая изменения значения некоторой переменной.

Более типичный шаблон проектирования для этого типа проблемы использует обратные вызовы иfunction a вызовет функцию обратного вызова, когда работа будет завершена, и начнется function b.Итак, вы передаете функцию в function a, которая должна быть вызвана, когда function a завершит свою работу.Более полный шаблон проектирования обычно имеет обратный вызов как для успешного выхода, так и для неудачного выхода и может даже передавать параметры из выхода, но, поскольку я не знаю ваших особенностей, я не пытался смоделировать это здесь.Для многоэтапного процесса это будет выглядеть так.Мы предполагаем, что в качестве функций a, b и c существуют три асинхронные функции, и каждая принимает функцию в качестве аргумента, который будет вызван после завершения асинхронной функции:

function main_function_step1() {
  a(main_function_step2);
}

function main_function_step2() {
  // execute code here that goes after function a, but before function b
  b(main_function_step3);
}

function main_function_step3() {
  // execute code here that goes after function b, but before function c
  c(main_function_finish);
}

function main_function_finish()
{
  // execute whatever code here to finish
}

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

В этом случае это будет выглядеть так:

function main_function_step1() {
  function main_function_a_step1_fail(err)
  {
    // handle error in step 1
  }
  var o = {success: main_function_step2, fail: main_function_a_step1_fail};
  a(o);
}

function main_function_step2(data) {
  // execute code here that goes after function a, but before function b
  function main_function_a_step2_fail(err)
  {
    // handle error in step 2
  }
  var o = {success: main_function_step3, fail: main_function_a_step2_fail};
  b(o);
}

function main_function_step3(data) {
  // execute code here that goes after function b, but before function c
  function main_function_a_step3_fail(err)
  {
    // handle error in step 3
  }
  var o = {success: main_function_finish, fail: main_function_a_step3_fail};
  c(o);
}

function main_function_finish(data)
{
  // execute whatever code here to finish
}

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

...