Проверка успешности или неудачи различных вызовов API - Angular 9, DjangoREST - PullRequest
0 голосов
/ 12 марта 2020

Сначала немного контекста, я кодировал «генератор форм», очень похожий на Google Forms, для внутреннего использования в компании, которая проводит несколько типов опросов, все в формате вопрос / ответ. Дизайн БД очень функционально похож на этот DB ER (взят из Дизайн базы данных для опроса )

Бэкэнд написан в Python с использованием Django и Django Rest Framework, внешний интерфейс - Angular 9. Некоторые вопросы являются более сложными, чем то, что Google Forms разрешает для нужд компании, например, некоторые вопросы допускают более одного ответа, некоторые ответы имеют «вторичные вопросы», связанные с они и другие вопросы зависят от определенных ответов (т.е. некоторые вопросы должны быть отключены, если определенный ответ не выбран)

Из-за сложности базы данных и, в основном, из-за моего общего недостатка опыта, мое решение в Мне кажется, что интерфейс с возможностью POST к API кажется мне взломанным. Логика вставки c выглядит следующим образом:

  1. Опрос создан
  2. Survey_Question создан (вопрос извлечен из специального типа ранее существовавшего «шаблонного» опроса)
  3. В зависимости от ТИПА Survey_Question (одиночный ответ, множественный ответ и c) создается один или несколько Survey_Question_Answers (OfferedAnswer также извлекается из специального шаблона)

Таблицы Person и Answer являются не используется в моем дизайне

Основная идея c способа кодирования в Angular заключается в следующем:

this.createSurvey().subscribe(survey => {
    this.questions.forEach(question => {
        question.survey = survey
        this.createQuestion(question).subscribe(newQuestion => {
            // same logic with answers that belong to this question
        })
    )}
})

Это основная c сущность вставить логи c. Поскольку я нахожусь в процессе изучения кода, на этом этапе я пришел к выводу, что вложение подписок таким способом не рекомендуется, хотя я извлек их в методы для предотвращения визуального «ада обратного вызова». Несмотря на свою функциональность, теперь я столкнулся с проблемой отсутствия представления о том, как отправить пользователю одно сообщение «Форма успешно сохранена» после успешного создания каждого вопроса через POST, поскольку при использовании не существует определенной последовательности (на мой взгляд) Asyn c называет это так.

Может кто-нибудь указать мне правильное направление, где читать или какие операторы, принадлежащие RX JS, были / подходят для этих типов задач?

1 Ответ

1 голос
/ 12 марта 2020

Вы избегаете ада обратного вызова, связывая здесь switchMap и forkJoin весь запрос на создание вопроса параллельно

this.createSurvey().pipe(switchMap(survey=>
 forkJoin(this.questions.map(question => {
        question.survey = survey
        return this.createQuestion(question)
 }))
).subscribe(e=>success action....)
...