在同一函数中解决承诺后返回承诺

Returning promise after resolving promise in same function

我有一个库函数,它需要 return 承诺 post 在它解决另一个承诺后,数据库中的某些东西。 我正在努力兑现承诺,但没有奏效。

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

当我在使用这个库的代码中调用函数时 它解决了问题,post正确地解决了问题,然后显示了第一个承诺的数据,而我需要第二个承诺。

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

这里的数据不是第二个promise而是第一个但是Issue创建正确

这里有几点。

  1. 使用 .then(successCallback, errorCallback) 而不是 .success().error()
  2. .then() 回调有一个参数,错误也是。
  3. 成功回调中的responseobject也包含headers和状态。您可以像这样访问它们:response.headersresponse.status(更多信息在 Official AngularJS Documentation for $http)。
  4. 您可以创建一个 $q.defer() 变量并在最后 return 它(resolve/reject 它在逻辑中),或者立即 return一个$q.reject$q.resolve。我已经编辑了您的代码并在 $q.reject.

    之前添加了 return
    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");
        });
    }