2016-04-25 7 views
1

У меня есть функция библиотеки, которая должна вернуть обещание опубликовать что-то в БД после того, как оно разрешит другое обещание. Я пытаюсь объединить обещания, но не работает.Возвращение обещания после разрешения обещания в той же функции

postIssue: function (issue) { 
        return getUserConfiguration() 
        .success(function (response, status, headers) { 
         var token = headers("X-XSRF-TOKEN"); 
         if (token) { 
          _cookie = token; 
          if (issue.isValid()) { 
           var url = _baseURL + "/api/issue/"; 
           var data = JSON.stringify(issue); 
           var config = { 
            xhrFields: { withCredentials: true }, 
            headers: { "X-XSRF-TOKEN": _cookie } 
           }; 
           return $http.post(url, data, config); 
          } 
          else { 
           return $q.reject("Issue doesn't have valid fields to submit"); 
          } 
         } 
         else { 
          $q.reject("There is no XSRF token on response header"); 
         } 
        }) 
        .error(function() { 
         $q.reject("Error getting user's configuration"); 
        }); 
       } 

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

libraryAPI.postIssue(createIssue).then(function (data) { 
       console.log(data); 
      },function (error) { 
       console.log(error); 
      }); 

данные здесь не из второго обещания, но первый один, но выпуск создан правильно

+0

Используйте 'затем' вместо' success'/'error' !!! – Bergi

+0

Также вы забыли 'return' before '$ q.reject (...)' – Bergi

+0

@Bergi нужно использовать успех, так как нужно получить доступ к заголовкам – OLDRomeo

ответ

1

Несколько точек здесь.

  1. Использование .then(successCallback, errorCallback), а не .success() и .error().
  2. Обратные вызовы .then() имеют один параметр, а также ошибку.
  3. Объект в успешном обратном вызове также содержит заголовки и статус. Вы можете получить к ним доступ так: response.headers и response.status (дополнительная информация в Official AngularJS Documentation for $http).
  4. Вы можете создать переменную ed $q.defer() и вернуть ее в конце (разрешить/отклонить в логике) или сразу же вернуть $q.reject или $q.resolve. Я отредактировал ваш код и добавил return до $q.reject.

    postIssue: function (issue) { 
        return getUserConfiguration() 
        .then(function (response) { 
         var headers = response.headers; 
         var token = headers("X-XSRF-TOKEN"); 
         if (token) { 
          _cookie = token; 
          if (issue.isValid()) { 
           var url = _baseURL + "/api/issue/"; 
           var data = JSON.stringify(issue); 
           var config = { 
            xhrFields: { withCredentials: true }, 
            headers: { "X-XSRF-TOKEN": _cookie } 
           }; 
           return $http.post(url, data, config); 
          } 
          else { 
           return $q.reject("Issue doesn't have valid fields to submit"); 
          } 
         } 
         else { 
          return $q.reject("There is no XSRF token on response header"); 
         } 
        }, function (error) { 
         return $q.reject("Error getting user's configuration"); 
        }); 
    } 
    
Смежные вопросы