我是angularjs世界的新手,我试图了解如何在angularjs同步中运行整个factry方法。
factory.factory("Connections", function($rootScope, $http, $q) {
var deferred = $q.defer();
var connectionStatus;
console.log("start of factory.factory function");
$http.get('http://localhost:8088/ecus').success(function(response) {
deferred.resolve(response);
console.log(" connection status: " + response.status);
connectionStatus = 'available';
})
.error(function(errResponse) {
deferred.reject({
message: "No connection"
});
// return deferred.promise;
connectionStatus = 'not available';
console.log(connectionStatus);
});
console.log("end of the factory.factory function");
return [{
id: 'conID1',
pathToImage: 'images/default_test /eBikeImages/Bionx_creme.png',
title: 'connection 1',
status: connectionStatus,
visible: true,
favorite: true
}];
});
这个想法是从URL调用中获取connectionStatus的值,并在返回值中使用它,这是JSON对象。 问题是正在调用工厂但是没有分配connectionsStatus的值,并且返回了带有connectionStatus的未定义值的Json。 在控制台中,我看到"工厂开始的日志"和"工厂结束"在http调用之前正在执行! 任何帮助将不胜感激:))
答案 0 :(得分:0)
您已经在使用promise服务,这将帮助您异步运行函数。
只需返回$ http服务功能。这本身就是回报承诺。
这是我要做的,
factory.factory("Connections", function($rootScope, $http, $q) {
var deferred = $q.defer();
var connectionStatus;
console.log("start of factory.factory function");
$http.get('http://localhost:8088/ecus').success(function(response) {
console.log(" connection status: " + response.status);
connectionStatus = 'available';
deferred.resolve({
id: 'conID1',
pathToImage: 'images/default_test /eBikeImages/Bionx_creme.png',
title: 'connection 1',
status: connectionStatus,
visible: true,
favorite: true
});
}).error(function(errResponse) {
connectionStatus = 'not available';
console.log(connectionStatus);
deferred.reject({
message: "No connection",
status: connectionStatus,
});
});
console.log("end of the factory.factory function");
return deferred.promise;
});
工厂的来电者将通过.then
功能
答案 1 :(得分:0)
你想把它作为同步运行,但是你要完成异步执行的依赖(即这里的ajax调用),所以你可以尝试的事情:
1> 返回一个承诺,并在您执行调用后解析该承诺并填充数据并使用数据解析,并在注入结束时使用.then(function(data){...})
并将回调传递给获取数据。或者你可以返回$ http直接返回的承诺。但是,由于您正在编写单独的服务,因此最好返回您感兴趣的数据。
2> es2017的异步和等待(新功能,到目前为止可能无法支持)
3> (不推荐,会阻止浏览器一段时间)编写自己的代码,使用XmlHttpRequest
进行同步ajax调用,因为使用$ http没有可配置的选项可以这一点。
4> 或者,返回引用,并在从服务器获得响应时填充该内部对象,并广播一些有意义的事件,如Connections.ready
。 (它不是通用解决方案,但会解决您的问题,因为您在服务中使用角度并注入$rootScope
。)
享受编码和异步执行处理:)
答案 2 :(得分:0)
请参阅更新的代码,只需构建新的回复
[HttpGet]
public JsonResult GetColorByCode(string value)
{
var resultValue = Server.UrlDecode(value);
return Json(new { data = resultValue, isSuccess = true}, JsonRequestBehavior.AllowGet);
}
在控制器中你会写
factory.factory("Connections", function($rootScope, $http, $q) {
var deferred = $q.defer();
var connectionStatus;
console.log("start of factory.factory function");
$http.get('http://localhost:8088/ecus').success(function(response) {
var newResponse = {
'response': response,
'connectionStatus': 'available'
};
deferred.resolve(newResponse);
console.log(" connection status: " + response.status);
connectionStatus = 'available';
})
.error(function(errResponse) {
var newResponse = {
'response': errResponse,
'connectionStatus': 'not available'
};
deferred.reject(newResponse);
connectionStatus = 'not available';
console.log(connectionStatus);
});
console.log("end of the factory.factory function");
return [{
id: 'conID1',
pathToImage: 'images/default_test /eBikeImages/Bionx_creme.png',
title: 'connection 1',
status: connectionStatus,
visible: true,
favorite: true
}];
});