XState: объединение нескольких обещаний без промежуточных состояний

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

// ...
invoke: [
  { id: 'service1', src: 'someService' },
  { id: 'service2', src: 'someService' },
  { id: 'logService', src: 'logService' }
],
// ...

Вот ответ и обходной путь создания промежуточных состояний

states: {
    first: {
      invoke: {
        src: 'one',
        onDone: {
          target: 'second',
        }
      }
    },
    second: {
      invoke: {
        src: 'two',
        onDone: {
          target: 'success',
        }
      }
    },
    success: {
      type: 'final'
    }
}

Есть ли способ сделать цепочку вроде Promise.each, с вызовами, может быть, заставить invoke([]) запускаться последовательно?

Я вижу только два варианта:

  1. Промежуточные состояния
  2. Вызовите одно обещание, которое само по себе выполняет цепочку.

1 ответ

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

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

async function sequence(...promiseCreators) {
  for (const promiseCreator of promiseCreators) {
    await promiseCreator();
  }

  return;
}

// ...
invoke: {
  src: () => sequence(createPromise1, createPromise2, createAsyncLogger)
}
// ...

Но здесь возникают дополнительные вопросы:

  • Что делать, если произойдет ошибка? (добавлятьtry/catch)
  • А как насчет прерывания / отмены? Как ты с этим справляешься?
  • Как вы собираете данные, полученные на основе обещаний?
  • Как вы справляетесь с разрешением зависимостей; т.е. обещание A зависит от данных из обещания B?

На них можно легко ответить для вашего варианта использования, но есть много возможных вариантов использования, которые следует учитывать. Вот почему лучше четко указать последовательность обещаний (используя промежуточные состояния), а не позволять библиотеке (XState) делать предположения о ваших сценариях использования.

Другие вопросы по тегам