如何在 AngularJS 中进行模拟同步 AJAX 调用?

Posted

技术标签:

【中文标题】如何在 AngularJS 中进行模拟同步 AJAX 调用?【英文标题】:How to make a simulated sync AJAX call in AngularJS? 【发布时间】:2016-09-17 07:11:42 【问题描述】:

我的 app.js 中有这个脚本:

app.run(['$http', '$location', 'myAppConfig', function ($http, $location, myAppConfig) 

    if (myAppConfig.webAPIPath.main == '') 

        var getconfigDone = false;

        $http.get('fileHandler.ashx?action=getconfig')
        .then(function (result) 
            if (JSON.parse(result.data.Data).APIURL !== undefined && JSON.parse(result.data.Data).APIURL != '') 
                var apiURL = JSON.parse(result.data.Data).APIURL;

                if (apiURL.lastIndexOf('/') + 1 == apiURL.length) 
                    apiURL = apiURL.substring(0, apiURL.lastIndexOf('/'))
                

                myAppConfig.webAPIPath.main = apiURL + "/";

                myAppConfig.webAPIPath.account = myAppConfig.webAPIPath.main + '/api/OnlineApplicationPortal/v1/Account/';

                myAppConfig.webAPIPath.dashboard = myAppConfig.webAPIPath.main + '/OnlineApplicationPortal/v1/Dashboard/';
            
            else 
                $location.path('Action/Welcome/apiUrlError');
            
            //debugger
            getconfigDone = true;

        , function (response)  debugger 

        );

    



]);

我也得到了这个工厂对象,它在 app.js 中使用了myAppConfig

(function () 

    angular
        .module('app.data')
        .factory('accountDS', ['$http', '$routeParams', 'myAppConfig', function ($http, $routeParams, myAppConfig) 
            var pathPrefix = myAppConfig.webAPIPath.account;

            var createAccount = function (account, email) 

                var OnlineApplicationPortalModel = 
                    Name: account.firstName,
                    Surname: account.lastName,
                    Email: email,
                    Password: account.password
                ;

                return $http.post(pathPrefix + 'CreateAccount', OnlineApplicationPortalModel)
                    .then(function (response) 

                        return response;
                    );
            ;

            var confirmEmail = function () 
                var data = 
                    guid: $routeParams.guid
                ;

                return $http.post(pathPrefix + 'ConfirmEmail', data)
                    .then(function (response) 
                        return response;
                    );
            

            return 
                createAccount: createAccount,
                confirmEmail: confirmEmail
            ;

]);

)();

服务对象需要使用myAppConfig.webAPIPath.account,在app.js的run函数中解析。现在的问题是,有时浏览器到达服务代码的时间比 AJAX 调用返回的时间早,这是一种竞争条件。我知道在 AngularJS 中不可能进行同步 AJAX 调用。那么我该如何解决呢?

【问题讨论】:

【参考方案1】:

如果我正确理解您,您希望 myAppConfig.webAPIPath.account 解析此值以便稍后在您的代码中使用它,但在分配之前并不总是调用为您提供此变量值的 ajax 调用。我认为您可以使用https://docs.angularjs.org/api/ng/service/$q 来解决您的问题。您在 myAppConfig 中的代码应该在函数内部,因此您可以在工厂内部调用它并返回延迟对象,然后当您设置 .account 变量时,应该从 accountDS 工厂调用代码。

【讨论】:

你找对了伙计。我对这个空间很陌生。你能用一些代码为我详细说明一下吗?

以上是关于如何在 AngularJS 中进行模拟同步 AJAX 调用?的主要内容,如果未能解决你的问题,请参考以下文章

在 Jasmine 单元测试中模拟 AngularJS 模块依赖项

如何通过模拟同步进行 d3 更新

AngularJS 在服务器和客户端之间自动同步数据

如何从同步代码中返回任务以进行模拟实现

如何在 AngularJS 单元测试中模拟 $window.location.replace?

如何在 AngularJS 中访问 c​​ookie?