Сложное дерево решений с использованием JS обещаний - PullRequest
0 голосов
/ 21 сентября 2019

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

Я прочитал следующие вопросы, но не смогнайти то, что я ищу:

Мои желания:

  1. Поток должен быть очень простым для понимания новыми разработчиками, которые войдут в проект в будущем.
  2. Каждое действие / шаг будет обрабатываться в изолированной функции / обещаниии может быть легко заменено без необходимости повторного тестирования других шагов.
  3. Ввод должен передаваться от каждого обещания к следующему.

Простое дерево решений, например: example decision tree

Я думал о следующих методах:

Метод 1

var path = "";
var input = {hhh:111};

step_1(input)
  .then(step_2)
  .then(change_path_to_A_or_B_according_to_input)

    .then(step_a1)
    .then(step_a2)
    .then(change_path_to_X_or_Z_according_to_input)

      .then(step_x1)
      .then(step_x2)

      .then(step_z1)

    .then(step_b1)
    .then(step_b2)
    .then(step_b3);

В этом методе каждый шаг или соединение сначала проверяют переменную пути, а затем решают, должен ли он выполняться или нет.Изменить путь относительно сложно, потому что содержание шагов должно меняться в зависимости от их расположения в дереве решений (т. Е. Необходимо скорректировать проверку переменной пути).Тем не менее, достаточно просто понять дерево решений, посмотрев на него, хотя отступы выполняются вручную и на самом деле не имеют никакого эффекта.

Метод 2

var input = {hhh:111};

step_1(input)
  .then(step_2)
  .then((input) => {
    if(condition) {
      return
        step_a1(input)
          .then(step_a2)
          .then((input) => {
            if(condition) {
              return
                step_x1(input)
                  .then(step_x2);
            } else {
              return
                step_z1(input);
            }
          });
    } else {
      return
        step_b1(input)
          .then(step_b2)
          .then(step_b3);
    }
  });

В этом методеизменить путь относительно легко, потому что нужно настроить только само дерево.Тем не менее, он менее читабелен.

Есть лучшие предложения?

1 Ответ

2 голосов
/ 21 сентября 2019

Метод 1 - это линейная цепочка обещаний, отступы в ней произвольны и не обязательно связаны с вашим внутренним потоком контроля.

Метод 2 - правильный путь - вот как вы выполняете условия в обещаниицепь.Для лучшей читаемости используйте другой стиль отступа и троичные операторы

step_1({hhh:111})
.then(step_2)
.then(input => condition
  ? step_a1(input)
    .then(step_a2)
    .then(input => condition
      ? step_x1(input)
        .then(step_x2)
      : step_z1(input)
    )
  : step_b1(input)
    .then(step_b2)
    .then(step_b3);
);

или используйте синтаксис async / await:

var input = {hhh:111};
input = await step_1(input);
input = await step_2(input);
if (condition) {
    input = await step_a1(input);
    input = await step_a2(input);
    if (condition) {
        input = await step_x1(input);
        input = await step_x2(input);
    } else {
        input = await step_z1(input);
    }
} else {
    input = await step_b1(input);
    input = await step_b2(input);
    input = await step_b3(input);
}
...