необходимо для синхронного программирования - PullRequest
1 голос
/ 26 апреля 2011

РЕДАКТИРОВАТЬ: Этот вопрос был неправильно выражен.Я действительно хотел спросить:

Есть ли что-нибудь, что нельзя написать на ОО-языках (с поддержкой замыканий), используя стиль передачи продолжения?

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

И после ответа на исходный вопрос я даже могу ответить самому себе * нет ничего подобного .Более того, это действительно очень хороший ОО-принцип под названием Tell Dont Ask

function getName(){
  return this.name;
}

console.log(xyz.getName())

против

function pushNameTo(callback){
  callback(this.name);
}

xyz.pushNameTo(console.log)

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

function renderOn(responseBuilder){
  var b = responseBuilder;

  //or just string, whatever, depending on your builder implementation
  b.field("Name: ", this.name);
  b.field("Age: ", this.age);
  b.image("Profile photo", this.imageData);
}

person.renderOn(htmlBuilder);

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

Конечно, это не обязательно означает, что вы должны иметь HTML в своем коде, сборщик служит этой цели.Он может даже генерировать некоторый xml или другой формат данных для фактического слоя рендеринга пользовательского интерфейса.Но это всегда толчок вместо тяги.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Ничего, конечно. Обратите внимание: если у вас есть программа, которая является полностью последовательной, вы можете просто вставить ее в какую-то оболочку, например document.onload (). Затем последовательная программа будет запущена асинхронно.

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

0 голосов
/ 26 апреля 2011

Существует два типа программ - императивные и функциональные.

Императивные программы являются последовательными - один шаг за другим. C ++, Java и т. Д. Являются примерами.

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

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

То, что вы описали в своем вопросе - это асинхронное программирование в стиле продолжения. Обратите внимание, что значение «продолжение» - «остальная часть программы после этой строки». Следовательно, теоретически каждая императивная программа может быть переписана в стиле «продолжения» (т.е. первая строка с продолжением остальной части программы начинается со второй строки и т. Д. И т. Д.). Например:

Statement #1
Statement #2
Statement #3

можно переписать как:

do(Statement #1, function{
  do(Statement #2, function{
    Statement #3
  })
})

где второй параметр do является продолжением оператора.

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

...