2017-02-21 60 views
1

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

Цель: воспользоваться услугой, которая вызывает другие услуги, и если возвращается какой-либо тип ошибки ( не имеет статуса 200), тогда мне нужно, чтобы асинхронная вещь ожидала и не продолжала.

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

Я читал различные статьи о том, что (1) делает Угловое под капотом, и я вижу, что есть $ д, .then, .success и т.д ..

Кажется, что у меня возникли проблемы с return и с другими вложенными и связанными вызовами службы, выполняемыми без какой-либо проверки проблемы.

По существу это изображение показывает, что возвращается

данные: нулевой (что плохо) errorList массив 1 0 «Этот порядок не может быть подано ...» (тоже плохо) hasErrors: правда (плохо, как а)

Так что данные важны для меня, чтобы захватить и показать пользователю, а затем НЕ перейти на дополнительной обработки

enter image description here

Это мой порядок операций

this.submitEnrollment = function (enrollment) { 
    return getSubmit(requestData); 
} 

// Which CALLS below 

var getSubmit = function (request) { 
    return SparkRequestService 
     .submitRequest(request) 
     .then(
      function (resData) { 
       console.log("resData", resData); 
       enrollmentService.resetEnrollment(); 
       return resData; 
      }, 
      function (resData) { 
       console.log('error'); 
      } 
     ); 
} 

Тогда я, конечно, призывающих SparkRequestService.submitRequest(request) , но на основе изображения прилагается, я получаю сообщение об ошибке в resData

Итак, мне кажется, что мне нужно запросить resData право? Поэтому я действительно НЕ ДОПУСКАЮ эту другую услугу, которая будет называться enrollmentService.resetEnrollment();

Как я могу реорганизовать, чтобы прекратить обработку? if в .then?

ответ

1

Чтобы предотвратить обработчик отказ от преобразования отвергнутый обещание на правдивое обещание важно используйте throw заявление в обработчике отбраковки:

var getSubmit = function (request) { 
    return SparkRequestService 
     .submitRequest(request) 
     .then(
      function (resData) { 
       console.log("resData", resData); 
       enrollmentService.resetEnrollment(); 
       return resData; 
      }, 
      function (errorResponse) { 
       console.log('error'); 
       //IMPORTANT 
       //throw to chain rejection 
       throw errorResponse; 
      } 
     ); 
} 

Когда функция опускает оператор return или throw, функция возвращает значение undefined. Это будет конвертировать отклоненное обещание к исполненному обещанию, которое разрешается со значением undefined.


Проблема заключается в том, что ... это бизнес-ошибка, завернутая в обратном объекте

Для преобразование выполнил обещание отклоненного обещания, использовать throw заявление.

this.submitEnrollment = function (enrollment) { 
    var promise = getSubmit(requestData); 
    var newPromise = promise.then(function(response) { 
     if (response.data.hasErrors) { 
      console.log(response.data.errorList); 
      response.data.errorList.push("submitEnrollent: Rejected"); 
      //THROW to create rejection 
      throw response; 
     } else { 
      //RETURN response to chain success 
      return response; 
     } 
    }); 
    return newPromise; 
} 

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

+0

Проблема в том, что 'encrollmentService.resetEnrollment();' будет вызван, потому что технически это деловая ошибка, завернутая в возвращаемый объект, поэтому я не вижу, как 'function (errorResponse)' будет даже попадаться, –

+0

Сладкий, большое вам спасибо! –

+0

Часть вопроса, которая меня смутила, заключается в том, что она говорила ** «не статус 200 **», когда на самом деле вы пытались отклонить ответ http-ответа статуса 200 (OK) при определенных условиях. – georgeawg

0

, кажется, что обещание, возвращаемый SparkRequestService.submitRequest(request) не отвергнута когда вы получите ошибку в resData. По этой причине вызывается successCallbackthen, а не второй, errorCallback.

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

var getSubmit = function (request) { 
    return SparkRequestService 
     .submitRequest(request) 
     .then(function (resData) { 
       console.log("resData", resData); 
       if(resData === null) { // Check for errors 
        // There is an error, manage it inside this block of code 
        // ... 
        // You can also create a rejected promise with $q.reject() and passing resData containing the errors 
        return $q.reject(resData); 
       } else { 
        // Call resetEnrollment() in the ELSE branch so, it is executed only if resData does not contain errors 
        enrollmentService.resetEnrollment(); 
        return resData; 
       } 
      }, 
      function (resData) { 
       console.log('error'); 
      } 
     ); 
}; 
+0

спасибо за консультацию resData никогда не является нулевым, но я дам вам +1, поскольку вы очень помогли мне в правильном направлении - thx –

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

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