如何在 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 模块依赖项