javascript - 使用 Promise Angularjs 工厂进行异步调用

标签 javascript angularjs angular-promise

我正在尝试使用工厂模式进行同步调用。

$scope.doLogin = function (username, password, rememberme) {
        appKeyService.makeCall().then(function (data) {
//            data = JSON.stringify(data);
            debugAlert("login controller app key service"+data);
            var appkeyvalue = data.d.appkey;
            sessionConfigurationService.setBasicToken(appkeyvalue);

            loginService.makeCall(username, password, rememberme).then(function (accessTokenData) {
                if (accessTokenData.access_token !== "")
                {
                    sessionConfigurationService.setAccessTokenData(accessTokenData.access_token);
                    userPreferencesService.makeCall().then(function (userPreferencesData) {
                        if (userPreferencesData.d.userId !== "")
                        { 
                            sessionConfigurationService.setUserPreferences(userPreferencesData.d);
//                            $window.location.href = '/base.html';
                        }
                    });
                }
            });
        });
    };

我的appKeyService工厂是

app.factory('appKeyService', function ($q, authenticatedServiceFactory, configurationService) {
    var deffered = $q.defer();
    var service = {};

    service.makeCall = function () {
        debugAlert("appKeyService async method request start");
         authenticatedServiceFactory.makeCall("GET", configurationService.getAppKeyURL(), "", "").then(function (data) {
            debugAlert("appKeyService async method response")
            deffered.resolve(data);
        });
        return deffered.promise;
    };
    return service;
});

我的经过身份验证的服务工厂是

app.factory('authenticatedServiceFactory', function ($http, $q, sessionConfigurationService) {
    var deffered = $q.defer();
    var service = {};
    service.makeCall = function (methodType, URL, data, authType) {

        var headerValue = "";
        if (authType === "Basic") {
            headerValue = sessionConfigurationService.getBasicToken();
        } else if (authType === "Bearer") {
            headerValue = sessionConfigurationService.getBearerToken();
        }

        var config = {headers: {
                'Authorization': headerValue,
                'Accept': 'application/json;odata=verbose',
            },
            withCredentials: true,
            async: false
        };
        if (methodType === "GET") {
            $http.get(URL, data, config)
                    .then(function (getData) {
                        debugAlert("GET method response" + JSON.stringify(getData));
                        deffered.resolve(getData.data);
                    }, function (error) {
                        debugAlert("GET method response error" + JSON.stringify(error));
                        deffered.reject(error);
                    });
        }
        else if (methodType === "POST") {
            $http.post(URL, data, config)
                    .then(function (putData) {
                        debugAlert("POST method response" + JSON.stringify(putData));
                        deffered.resolve(putData.data);
                    }, function (error) {
                        debugAlert("POST method response error" + JSON.stringify(error));
                        deffered.reject(error);
                    });
        }
        else if (methodType === "DELETE") {
            $http.delete(URL, data, config)
                    .then(function (deleteData) {
                        debugAlert("DELETE method response" + JSON.stringify(deleteData));
                        deffered.resolve(deleteData.data);
                    }, function (error) {
                        debugAlert("DELETE method response error" + JSON.stringify(error));
                        deffered.reject(error);
                    });
        }
        else if (methodType === "PUT") {
            $http.put(URL, config)
                    .then(function (putData) {
                        debugAlert("PUT method response" + JSON.stringify(putData));
                        deffered.resolve(putData.data);
                    }, function (error) {
                        debugAlert("PUT method response error" + JSON.stringify(error));
                        deffered.reject(error);
                    });
        }
        return deffered.promise;
    };
    return service;
});

但我没有看到服务调用是同步进行的。因此,在我们收到响应之后, Controller 中的“then”部分不会执行。它一个接一个地执行。我怎样才能做到这一点。

最佳答案

@Frane Poljak

感谢您的评论。我刚带来

var deffered = $q.defer();

在 makeCall 方法内部及其现在按照我想要的方式工作。谢谢!

app.factory('appKeyService', function ($q, authenticatedServiceFactory, configurationService) {
    var service = {};

    service.makeCall = function () {
    var deffered = $q.defer();

        debugAlert("appKeyService async method request start");
         authenticatedServiceFactory.makeCall("GET", configurationService.getAppKeyURL(), "", "").then(function (data) {
            debugAlert("appKeyService async method response")
            deffered.resolve(data);
        });
        return deffered.promise;
    };
    return service;
});

关于javascript - 使用 Promise Angularjs 工厂进行异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36264374/

相关文章:

javascript - vis.js 在节点数 > 40 时停止响应

javascript - 如何使用 jQuery 动态添加包含 EJS 的页面元素?

javascript - AngularJS : ng-repeat for plain text

javascript - 使用另一个库中的事件更新 Angular 上的某些内容

javascript - Angular : Enhancing or wrapping promises with pre/post resolve/reject actions

angularjs - $q 不等到嵌套的 $http 调用完成

Javascript 在两个地方创建元素

javascript - 用 typescript 转换 javascript 事件 this

javascript - 使用 ng-click 切换 3 个不同的 div

javascript - 创建一个没有返回值的 AngularJS promise