在同一功能中解决承诺后返回承诺

时间:2016-04-25 23:21:44

标签: javascript angularjs promise angular-promise

我有库函数,需要返回承诺,在解析另一个承诺后在DB中发布内容。 我试图将承诺链接起来但不起作用。

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);
            });

这里的数据不是第二个承诺,而是第一个承诺,但问题是正确创建的

1 个答案:

答案 0 :(得分:1)

这里有几点。

  1. 使用.then(successCallback, errorCallback)而不是.success().error()
  2. .then()回调有一个参数,错误也是如此。
  3. 成功回调中的response对象还包含标题和状态。您可以像这样访问它们:response.headersresponse.statusOfficial AngularJS Documentation for $http中的更多信息)。
  4. 您可以创建$q.defer()' ed变量并在结尾返回它(在逻辑中解析/拒绝它),或者立即返回$q.reject或{{ 1}}。我已修改了您的代码,并在$q.resolve之前添加了return

    $q.reject