2014-01-23 5 views
0

Я новичок в угловом и хочу использовать его для отправки данных на бэкэнд моего приложения. В нескольких случаях я должен сделать несколько сообщений по почте, которые должны либо все преуспеть, либо все провалиться. Это сценарий, который вызывает у меня головную боль: если у вас два HTTP-сообщения, что, если один вызов преуспеет, а другой не удается? Это приведет к несогласованности в базе данных. Я хочу знать, есть ли способ отменить последующие вызовы, если по крайней мере один вызов завершился неудачно. Благодаря!

ответ

0

Не зная больше о вашей конкретной ситуации, я бы настоятельно рекомендовал вам использовать обработку ошибок обещаний, если вы этого еще не сделали. Есть только одна ситуация, которую я знаю, что вы можете отменить обещание, которое было отправлено, используя параметр таймаута в $ http (посмотрите на this SO post), но вы можете определенно предотвратить будущие запросы. Что происходит, когда вы делаете вызов $ http, это то, что он возвращает объект обещания (смотрите $ q here). Это означает, что он возвращает два метода, которые вы можете связать с запросом $ http, называемым успехом и неудачей, поэтому он выглядит как $ http.success ({... stuff ...}). Error ({... more stuff. .}). Поэтому, если у вас есть обработка ошибок в каждом из этих сценариев, и вы получаете .error, не делайте следующий вызов.

0

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

Если каждый шаг зависит от другого и вызывает изменения в вашей базе данных, возможно, лучше всего выполнить весь процесс в бэкэнд, вызванный одним запросом «POST». Я думаю, что проще моделировать этот процесс синхронно, и это проще сделать на сервере, чем на клиенте.

Однако, если вы должны выполнять почтовые запросы на стороне клиента, вы можете определить каждый шаг запроса как отдельную функцию и связать их с помощью then(successCallback, errorCallback) (пример Nice video здесь: https://egghead.io/lessons/angularjs-chained-promises).

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

var firstStep = function(initialData){ 
    return $http.post('/some/url', data).then(function(dataFromServer){ 
    // Do something with the data 
    return { 
     dataNeededByNextStep: processedData, 
     dataNeededToReverseThisStep: moreData 
    } 
    }); 
}; 
var secondStep = function(dataFromPreviousStep){ 
    return $http.post('/some/other/url', data).then(function(dataFromServer){ 
    // Do something with the data 
    return { 
     dataNeededByNextStep: processedData, 
     dataNeededToReverseThisStep: moreData 
    } 
    }, function(){ 
    // On error 
    reversePreviousStep(dataFromPreviousStep.dataNeededToReverseThisStep); 
    }); 
}; 
var thirdFunction = function(){ ... }; 

... 

firstFunction(initialData).then(secondFunction) 
          .then(thirdFunction) 
          ... 

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

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