有没有办法用AngularJS进行同步调用?
AngularJS文档对于弄清楚一些基本的东西来说并不是非常明确或广泛。
在服务上:
myService.getByID = function (id) {
var retval = null;
$http({
url: "/CO/api/products/" + id,
method: "GET"
}).success(function (data, status, headers, config) {
retval = data.Data;
});
return retval;
}
发布于 2012-10-26 22:00:52
目前还没有。如果使用look at the source code (from this point in time Oct 2012),您将看到对XHR open的调用实际上是硬编码为异步的(第三个参数为true):
xhr.open(method, url, true);
您需要编写自己的服务来执行同步调用。通常情况下,这不是您通常想要做的事情,因为JavaScript执行的性质决定了您最终会阻塞其他所有东西。
..。但是..。如果真的需要屏蔽其他所有东西,也许你应该考虑一下promises和$q service。它允许您等待一组异步操作完成,然后在它们全部完成后执行某些操作。我不知道你的用例是什么,但这可能值得一看。
除此之外,如果您打算使用自己的方法,请参阅有关如何进行同步和异步ajax调用can be found here的更多信息。
我希望这能对你有所帮助。
发布于 2014-06-26 16:57:26
我曾与一家工厂合作,集成了谷歌地图自动完成和承诺做出的,我希望你服务。
http://jsfiddle.net/the_pianist2/vL9nkfe3/1/
您只需通过此请求将autocompleteService替换为出厂前的$ http incuida。
app.factory('Autocomplete', function($q, $http) {
和$ http请求
var deferred = $q.defer();
$http.get('urlExample').
success(function(data, status, headers, config) {
deferred.resolve(data);
}).
error(function(data, status, headers, config) {
deferred.reject(status);
});
return deferred.promise;
<div ng-app="myApp">
<div ng-controller="myController">
<input type="text" ng-model="search"></input>
<div class="bs-example">
<table class="table" >
<thead>
<tr>
<th>#</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="direction in directions">
<td>{{$index}}</td>
<td>{{direction.description}}</td>
</tr>
</tbody>
</table>
</div>
'use strict';
var app = angular.module('myApp', []);
app.factory('Autocomplete', function($q) {
var get = function(search) {
var deferred = $q.defer();
var autocompleteService = new google.maps.places.AutocompleteService();
autocompleteService.getPlacePredictions({
input: search,
types: ['geocode'],
componentRestrictions: {
country: 'ES'
}
}, function(predictions, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
deferred.resolve(predictions);
} else {
deferred.reject(status);
}
});
return deferred.promise;
};
return {
get: get
};
});
app.controller('myController', function($scope, Autocomplete) {
$scope.$watch('search', function(newValue, oldValue) {
var promesa = Autocomplete.get(newValue);
promesa.then(function(value) {
$scope.directions = value;
}, function(reason) {
$scope.error = reason;
});
});
});
问题本身是在以下方面提出的:
deferred.resolve(varResult);
当你做得很好,并且你的请求:
deferred.reject(error);
当出现错误时,然后:
return deferred.promise;
发布于 2015-09-04 18:37:44
var EmployeeController = ["$scope", "EmployeeService",
function ($scope, EmployeeService) {
$scope.Employee = {};
$scope.Save = function (Employee) {
if ($scope.EmployeeForm.$valid) {
EmployeeService
.Save(Employee)
.then(function (response) {
if (response.HasError) {
$scope.HasError = response.HasError;
$scope.ErrorMessage = response.ResponseMessage;
} else {
}
})
.catch(function (response) {
});
}
}
}]
var EmployeeService = ["$http", "$q",
function ($http, $q) {
var self = this;
self.Save = function (employee) {
var deferred = $q.defer();
$http
.post("/api/EmployeeApi/Create", angular.toJson(employee))
.success(function (response, status, headers, config) {
deferred.resolve(response, status, headers, config);
})
.error(function (response, status, headers, config) {
deferred.reject(response, status, headers, config);
});
return deferred.promise;
};
https://stackoverflow.com/questions/13088153
复制相似问题