Javascript AngularJS承诺不回电话?
通常,当我以异步方式获取数据时,我会像这样做Javascript AngularJS承诺不回电话?,javascript,ajax,angularjs,asynchronous,angular-promise,Javascript,Ajax,Angularjs,Asynchronous,Angular Promise,通常,当我以异步方式获取数据时,我会像这样做 var promise = $http.get('/api/v1/movies/avengers'); promise.then( function(payload) { $scope.movieContent = payload; }); $scope.movieContent = $http.get('/api/v1/movies/avengers'); //updates to real value when request
var promise = $http.get('/api/v1/movies/avengers');
promise.then(
function(payload) {
$scope.movieContent = payload;
});
$scope.movieContent = $http.get('/api/v1/movies/avengers'); //updates to real value when request is done
事实上,这种情况非常常见-我发送一些请求,当它准备好时,我将返回的所有内容都分配给某个变量/道具。但是每次它都需要进行回调,即使回调总是相同的
有什么办法可以像这样做吗
var promise = $http.get('/api/v1/movies/avengers');
promise.then(
function(payload) {
$scope.movieContent = payload;
});
$scope.movieContent = $http.get('/api/v1/movies/avengers'); //updates to real value when request is done
或者说
updateWhenReady($scope.movieContent , '/api/v1/movies/avengers');
这没什么大不了的,但在我看来,大量使用会产生不同。您可以将异步调用封装在函数中:
function load(cb, model){
cb.then(function(payload){
model = payload;
});
}
*但我不建议你这样做。通常,您希望在回调函数中执行特定任务(如处理加载指示器等)。这并不完全是您所要求的,但您可以“动态”生成这些回调: 或者(如果您更喜欢这种语法):
请注意,错误处理非常重要。如果承诺被拒绝,您可能需要通知用户。您可以设计您的服务,使其返回空引用,并在服务调用成功返回时填充自身。使用
angular.copy
保留参考:
服务
app.factory('avengersService', function($http) {
return {
getAvengers: function() {
var avengers = [];
avengers.$promise = $http.get('/api/v1/movies/avengers').then(function(result) {
angular.copy(result.data, avengers);
return result;
});
return avengers;
}
}
});
控制器
app.controller('ctrl', function($scope, avengersService) {
$scope.movieContent = avengersService.getAvengers();
// or call the promise version
avengersService.getAvengers().$promise.then(function(result) {
$scope.movieContent = result.data;
});
});
不。javascript没有这个功能。编写一个服务来实现这一点非常简单NGResource就是这么做的。以前http promise提供了自动承诺展开功能。后来它被弃用了(1.2.x),您只能通过执行
.config(function($parseProvider){$parseProvider.unwrapPromises(true);})来关闭它代码>。在较新版本中,此功能已完全删除。用你正在使用的angular版本试试你的luch。然而,正确的方法是通过承诺本身来实现。另一种方法是在路线中使用resolve。这是创建assingToScope函数的正确方法吗?难道我不应该创建一个有棱角图案的工厂或类似的东西吗?老实说,我不知道。。。我没有那么多关于角度的经验,更多的是关于普通JS;-)