2016-11-03 2 views
0

Я работаю со стеком MEAN.Неправильно ли использовать цепочку вызовов сервера, которые зависят друг от друга в рамках обещаний переднего плана?

Например, в моем угловом коде я мог бы иметь:

Brand.create({name: 'name'}).then(function(brand){ 

    //here, the product's referenced brand._id depends on the Brand response 

    Product.create({'name':'name', 'category': 'food', 
     'brand': brand.data._id}).then(function(res){ 
     $scope.product = res.data; 
    }); 
}); 

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

Если да, то было бы лучше всего соединить две разные коллекции внутри одного из их соответствующих контроллеров?

ответ

2

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

Да. Лучше было бы сделать это на стороне сервера по ряду причин:

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

И. Независимо от того, где вы пишете код, вам нужна правильная обработка ошибок либо с помощью какой-либо системы транзакций в базе данных, либо с помощью ручной обработки ошибок, которая разматывает предыдущие операции, когда более поздние из них терпят неудачу, поэтому вы всегда получаете действительную систему, даже если средний или более поздний шаги не пройдены. В приведенном выше сценарии с клиентом вам нужен обработчик .catch() по адресу Produce.create(), поэтому, если это не удается, вы можете отменить Band.create() ранее, поэтому вы оставите систему в правильном состоянии, если у вас есть ошибка нисходящего потока. Обратите внимание, что это почти невозможно в условиях проблем с подключением клиентов, если вы управляете несколькими шагами от клиента, но гораздо более практичны, когда делаете это с сервера, где значительно меньше вероятность возникновения проблем с подключением.

+0

Спасибо. Это было близко к моему предположению. Ваш подробный ответ был именно тем, что я искал. – NoobSter

 Смежные вопросы

  • Нет связанных вопросов^_^